TeamCity Nuget安装构建步骤在多个源的情况下无法正常工作,其中一个是TC的私有NuGet feed。

9
在将源设置为TeamCity的NuGet服务器时,在NuGet Install构建步骤中收到以下错误:
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 feed url和标准NuGet feed url都放在构建步骤中作为包源了吗?NuGet.exe命令行似乎只使用一个包源。我还会检查Team City NuGet feed url是否正确,并且访客认证是否已打开,因为我不认为它应该返回404。NuGet.exe应该返回指示未找到包而不是404的消息。 - Matt Ward
404错误是因为在“软件包源”字段中使用%teamcity.nuget.feed.server%时,它会被翻译成访客(无身份验证)TC的NuGet源(类似于http://localhost:9090/guestAuth/app/nuget/v1/FeedService.svc)。但是,我已禁用公共源。这就是为什么会出现404错误。我刚刚弄清楚了这一点。仍在研究如何使用私有源解决此问题,但尚未找到解决方案。 - mare
这里有一个类似的问题,指引我朝着正确的方向,但它不适用于私有的TC NuGet feed:https://dev59.com/questions/imcs5IYBdhLWcg3wYy9T - mare
3个回答

17

您可以通过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文件放在一起。


1
这个解决方案确实很简单,但它会将您的仓库密码留在源代码控制中。这通常被认为是一种安全风险 - John Hoerr
即使没有提供凭据并且软件包位于网络存储库中,此解决方案仍可正常工作。 - Shriroop

3

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

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。它们不会过期。 - Sam

3
我们在TeamCity插件中实现了经过身份验证的Feed支持。请按照问题http://youtrack.jetbrains.com/issue/TW-20764中的评论进行操作。

6年过去了,TeamCity仍然不支持经过身份验证的NuGet源?还是我漏掉了什么? - Bil Simser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接