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 源的主要内容,如果未能解决你的问题,请参考以下文章