如何将自定义的NuGet源添加到TeamCity构建中?

50

我使用在互联网上的虚拟机上运行的Teamcity创建了一个Nuget Server,并创建了将软件包发布到其中的构建。

我还有另一个需要使用该软件包的项目。这个项目也是在Teamcity上构建的。在我的本地Visual Studio中,我添加了Nuget Feed URI, 安装了软件包,一切正常。但是当我尝试在Teamcity上构建时,它显示“找不到软件包”。

所以我的问题是:“如何将自定义Nuget Feed添加到TeamCity构建中?”

4个回答

52
NuGet包源是通过Visual Studio配置的,但它们存储在每个用户的配置文件中,该文件位于c:\Users\$USER\AppData\Roaming\NuGet\NuGet.config。需要将TeamCity包源条目添加到运行构建的构建代理用户的配置文件中。
  1. 在本地计算机上,打开您的用户的Nuget.config文件
  2. 将TeamCity包源的条目复制到剪贴板上
  3. 在构建代理上,为执行TeamCity构建的用户打开NuGet.config文件
  4. 粘贴TeamCity包源条目。保存并退出。
  5. 再次运行构建。现在应该能够找到该软件包。

编辑:ladenedge记录了一种我最初回答此问题时不存在的好方法。 如果您没有对构建代理进行管理员访问权限或想要按项目配置软件包来源,则此解决方案特别有用。


太好了,完美运作。还有一个小问题,如何保存nuget feed的凭据?我现在使用公共的teamcity feed,但我希望使用登录/密码认证。 - Eugene
1
请查看这个问题的答案。我不太喜欢被接受的答案,因为它会以明文形式留下您的密码。建议查看Eugene Petrenko的答案 - 他是TeamCity开发人员,知道他在说什么。 - John Hoerr
20
如果您正在以Windows SYSTEM账户运行构建代理,则配置文件路径将为C:\ Windows \ SysWOW64 \ config \ systemprofile \ AppData \ Roaming \ NuGet \ NuGet.Config(64位操作系统)或 C:\ Windows \ System32 \ config \ systemprofile \ AppData \ Roaming \ NuGet \ NuGet.Config (32位操作系统)。 - Andrew Cupper
1
顺便提一下,TeamCity会在构建日志中写入配置文件的源代码,因此您可以轻松找到应该在这种情况下编辑的确切配置。使用的NuGet配置文件: C:\Windows\system32\config\systemprofile\AppData\Roaming\NuGet\NuGet.Config C:\Program Files (x86)\NuGet\Config\Microsoft.VisualStudio.Offline.config使用的Feeds: https://api.nuget.org/v3/index.json - Anton
谢谢分享!对我来说,在Windows 11(64位)上,文件夹是:C:\Windows\System32\config\systemprofile\AppData\Roaming\NuGet。 - Markus Knappen Johansson

29

NuGet现在可以从存储在源代码本身中的NuGet.targets文件中读取源代码,如答案所述,以解决重复问题

<ItemGroup Condition=" '$(PackageSources)' == '' ">
    <!-- Package sources used to restore packages. By default, registered sources under %APPDATA%\NuGet\NuGet.Config will be used -->
    <!-- The official NuGet package source (https://nuget.org/api/v2/) will be excluded if package sources are specified and it does not appear in the list -->
    <PackageSource Include="https://nuget.org/api/v2/" />
    <PackageSource Include="https://my-nuget-source/nuget/" />
</ItemGroup>

25

我不想在源代码中添加NuGet.config的feed,因为这是构建基础设施的一部分,而不是应用程序代码的一部分。

我也不想在TeamCity构建代理中添加NuGet.config的feed,因为它很难维护(更新、添加、删除),而且我们有很多构建代理。

对我来说最好的方法是在TeamCity(根项目)中添加%system.PackageSources%,其中包含全局NuGet feed和我的自定义(以分号分隔):

https://www.nuget.org/api/v2/; http://<teamcity_server_name>:81/guestAuth/app/nuget/v1/FeedService.svc

如果您查看NuGet.Targets,您会发现如果定义了$(PackageSources),它将使用它。因此,您可以在TeamCity中将其定义为“system”参数,并将其传递给构建过程。


1
这太棒了 - 我也想避免你提到的两个依赖关系,而且这个方法非常有效。其他答案也不错,但在我看来,这是首选的方法。 - ket
你是不是想在变量名中包含百分号?我猜不是。这只是它的名称。所以变量的名称应该是"system.PackageSources",不需要引号吗? - as9876
在TeamCity中引用属性的方式是将其放在百分号中,例如%build.counter%,当然这不是属性名称的一部分,请参见:https://confluence.jetbrains.com/display/TCD18/Configuring+Build+Parameters#ConfiguringBuildParameters-DefiningBuildParametersinBuildConfiguration - Ivan
5
@Ivan,有没有办法通过环境变量添加身份验证(用户名和密码)?我们的源受到保护,我找不到任何设置环境变量的方法。具体来说,我需要设置通常在NuGet.Config的“packageSourceCredentials”部分中的值。 - feO2x

0
在TeamCity中,我们设置了两个NuGet安装步骤;第一个步骤负责本地(自定义)NuGet安装,第二个步骤还原可通过互联网访问的NuGet包。

Two TeamCity Build Steps

本地(自定义)安装程序会查看 .sln 文件,然后使用我们定义的软件包源路径来查找我们的本地 NuGet 软件包。

Local(custom) NuGet Build Step

这是使用 TeamCity v2022.04.3 完成的。


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