TeamCity Nuget 安装构建步骤不适用于多个源,其中之一是 TC 的私有 NuGet 源

Posted

技术标签:

【中文标题】TeamCity Nuget 安装构建步骤不适用于多个源,其中之一是 TC 的私有 NuGet 源【英文标题】:TeamCity Nuget install build step not working with multiple sources, one of them TC's private NuGet feed 【发布时间】:2012-12-15 16:15:52 【问题描述】:

在将源设置为 TeamCity 的 NuGet 服务器时,我在 NuGet 安装构建步骤中收到以下错误:

Step 1/4: NuGet install (NuGet Installer) (3s)

[15:11:19][Step 1/4] scan: Searching for nuget.config files

[15:11:19][Step 1/4] install: Installing NuGet packages for packages.config (3s)

[15:11:19][install] NuGet command: C:\TeamCity\buildAgent\tools\NuGet.CommandLine.2.2.0.nupkg\tools\NuGet.exe install C:\TeamCity\buildAgent\work\a4b9de5be22a981\packages.config -OutputDirectory C:\TeamCity\buildAgent\work\a4b9de5be22a981\packages -Source http://localhost:9090/guestAuth/app/nuget/v1/FeedService.svc

[15:11:19][install] Starting: C:\TeamCity\buildAgent\temp\agentTmp\custom_script96367186180319830.cmd

[15:11:19][install] in directory: C:\TeamCity\buildAgent\work\a4b9de5be22a981

[15:11:22][install] The remote server returned an error: (404) Not Found.

[15:11:22][install] Process exited with code 1

[15:11:22][Step 1/4] Step NuGet install (NuGet Installer) failed

如果我将源字段留空,它将从默认提要(NuGet 社区提要)中找到 NuGet 包,而不是在本地构建和打包并托管在 TC 的 NuGet 提要中的包。

如何在 NuGet 安装程序构建步骤中同时使用默认提要和内部 TC 的 NuGet 提要?

【问题讨论】:

您是否尝试在构建步骤中将 Team City NuGet 提要 url 和标准 NuGet 提要 url 作为包源? NuGet.exe 命令行看起来只使用一个包源。我还会检查 Team City NuGet 提要 url 是否正确,并且访客身份验证是否已打开,因为我认为它不应该返回 404。NuGet.exe 应该返回一条消息,指示找不到包而不是 404。 发生 404 是因为在 Package sources 字段中使用 %teamcity.nuget.feed.server% 时,它会被转换为来宾(无身份验证)TC 的 NuGet 提要(类似于 localhost:9090/guestAuth/app/nuget/v1/FeedService.svc) .但是,我禁用了公共供稿。这就是 404 的原因。我刚才想通了。仍在研究如何使用私人提要执行此操作,但尚未找到解决方案。 这是一个类似的问题,它为我指明了正确的方向,但它不适用于私人 TC NuGet 提要:***.com/questions/12897747/… 【参考方案1】:

您可以通过nuget.config 文件为解决方案指定自定义提要。

关键是要像这样提供凭证部分packageSourceCredentials

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <add key="Local" value="http://localhost:9090/httpAuth/app/nuget/v1/FeedService.svc" />
  </packageSources>
  <activePackageSource>
    <add key="Local" value="http://localhost:9090/httpAuth/app/nuget/v1/FeedService.svc" />
  </activePackageSource>
  <packageSourceCredentials>
    <Local>
      <Username>login</Username>
      <Password>pa$$w0rd</Password>
    </Local>
  </packageSourceCredentials>
</configuration>

这个config 文件应该在存储库中的sln 文件旁边。

【讨论】:

此解决方案绝对简单,但它保留了您的存储库密码源代码控制。这通常被认为是security risk。 即使未提供凭据且软件包位于网络存储库中,此解决方案也有效。【参考方案2】:

这似乎是 TeamCity 的 known issue。解决方法建议通过命令行客户端添加包源,然后使用授权凭据更新这些源:

nuget sources add -name [name] -source [feedUrl]
nuget sources update -Name [name] -User [username] -pass [password]

据我了解,Nuget 将为将来的请求缓存这些凭据。我不知道该缓存多久被清除一次;您可能需要在开始构建之前运行 nget sources update 以确保缓存一致。

【讨论】:

它们被添加到用户 nuget.config。例如:C:\users\john\appdata\nuget\nuget.config 他们不会过期【参考方案3】:

我们在 TeamCity 插件中实现了经过身份验证的提要支持。请关注 cmets 到问题 http://youtrack.jetbrains.com/issue/TW-20764

【讨论】:

6 年后,TeamCity 仍然不支持经过身份验证的 NuGet 源?还是我错过了什么?

以上是关于TeamCity Nuget 安装构建步骤不适用于多个源,其中之一是 TC 的私有 NuGet 源的主要内容,如果未能解决你的问题,请参考以下文章

NuGet 自动包还原不适用于 MSBuild

TeamCity NuGet Feed:配置Feed网址

TeamCity - MSBuild无法找到NuGet引用

Team City 自定义 NuGet 包还原未发生

TeamCity 是不是支持执行其他 TeamCity 构建的构建步骤?

TeamCity,将在一个构建步骤中生成的 id 传递到后面的构建步骤