【问题标题】:How to add the custom nuget feed to TeamCity build?如何将自定义 nuget 提要添加到 TeamCity 构建?
【发布时间】:2013-01-10 23:34:20
【问题描述】:

我使用 Teamcity(在 Internet 的虚拟机上运行)创建了一个 Nuget 服务器,并创建了将包发布到其中的构建。

我还有另一个项目需要使用该包。这个项目也是建立在 teamcity 之上的。在我本地的 Visual Studio 上,我添加了 nuget feed uri,安装了包,一切正常。但是当我尝试在 teamcity 上构建它时,它说“找不到包”。

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

【问题讨论】:

    标签: .net msbuild teamcity nuget


    【解决方案1】:

    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 提要,但我希望我使用登录名/密码身份验证。
    • 查看this question 的答案。我对接受的答案并不感到疯狂,因为它以纯文本形式保留了您的密码。 Eugene Petrenko 的回答值得一试——他是 TeamCity 开发人员,知道自己在说什么。
    • 如果您在 Windows SYSTEM 帐户下运行构建代理,那么配置文件路径将为 C:\Windows\SysWOW64\config\systemprofile\AppData\Roaming\NuGet\NuGet.Config(对于 64 位操作系统)或 C:\Windows\System32\config\systemprofile\AppData\Roaming\NuGet\NuGet.Config(对于 32 位操作系统)。
    • 顺便说一句,TeamCity 在构建日志中写入配置文件的源代码,因此您可以轻松找到在这种情况下应该编辑的确切配置NuGet Config files used: C:\Windows\system32\config\systemprofile\AppData\Roaming\NuGet\NuGet.Config C:\Program Files (x86)\NuGet\Config\Microsoft.VisualStudio.Offline.config Feeds used: https://api.nuget.org/v3/index.json
    【解决方案2】:

    NuGet 现在可以从与源本身一起存储的NuGet.targets 文件中读取源,如the answera duplicate question 中所述。

    <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>
    

    【讨论】:

      【解决方案3】:

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

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

      什么对我最有效 - 在 TeamCity(根项目上)中添加 %system.PackageSources%,其中包含全局 nuget 提要和我的自定义(分号分隔):

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

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

      【讨论】:

      • 这太棒了——我也想避免你提到的两个依赖项,这就像一个魅力。其他答案都很好,但 IMO 这是选择的方法。
      • 您的意思是在变量名称中包含百分号吗?我假设不是。这就是它的名称。那么变量的名称将是“system.PackageSources”不带引号?
      • 用百分号括起来是在 TeamCity 中引用属性的方式,例如%build.counter%,当然不是属性名的一部分,见:confluence.jetbrains.com/display/TCD18/…
      • @Ivan 有没有办法通过环境变量添加身份验证(用户名和密码)?我们的提要受到保护,我找不到通过环境变量设置这些提要的任何方法。具体来说,我需要设置通常位于 NuGet.Config 中 packageSourceCredentials 部分的值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-12
      • 2012-09-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      相关资源
      最近更新 更多