【问题标题】:Include NuGet packages in TeamCity在 TeamCity 中包含 NuGet 包
【发布时间】:2013-01-04 12:12:03
【问题描述】:

我最近开始使用 NuGet 来管理外部包。现在我只需要它来处理 NLog。 当我在 VS 2012 中构建项目时,一切正常。但是,我正在尝试将 TeamCity 作为 CI 服务器(我对 CI 很陌生),它给了我以下错误:

[Csc] SomeNamespace\SomeClass.cs(10, 7): error CS0246: 
The type or namespace name 'NLog' could not be found 
(are you missing a using directive or an assembly reference?)

(这个错误在我使用 NLog 的地方重复出现)

现在我没有在 SVN 中包含“packages/”文件夹,因为我认为最好不要包含二进制文件,而是让 TeamCity 中的 MSBuild 自行下载这些文件。然而,它显然没有这样做。我确实在 SVN 中包含了“packages.xml”文件。 我可以检查什么以了解问题所在?

更新 感谢@DavidBrabant,我被推向了正确的方向。但是,我现在在 TeamCity 中收到以下错误:

Package restore is disabled by default. To give consent, open the Visual Studio Options dialog, 
click on Package Manager node and check 'Allow NuGet to download missing packages during build.'

但是我不在 Visual Studio 中,而是在 TeamCity 中,所以我不知道如何将“同意”设置为 true!我尝试在 NuGet.targets 文件中将 RestorePackages 设置为“true”:

<RestorePackages Condition="  '$(RestorePackages)' == '' ">true</RestorePackages>

但这不起作用。

更新 2 为了使其工作,我还设置了以下属性 NuGet.targets:

<RequireRestoreConsent Condition=" '$(RequireRestoreConsent)' != 'true' ">false</RequireRestoreConsent>

这使得构建运行成功!

【问题讨论】:

  • 你能从 CI 机器连接到 Nuget 存储库吗(你能 ping 通它)吗?
  • 您是否启用了包恢复?
  • 实际上最好的做法是在存储库中拥有构建项目所需的一切。
  • 伙计,我可能真的很愚蠢,但我需要很长时间才能理解最后一个字符串必须看起来像 &lt;RequireRestoreConsent Condition=" '$(RequireRestoreConsent)' != 'true' "&gt;false&lt;/RequireRestoreConsent&gt; 我认为指定正确的字符串而不是初始字符串是有意义的它的版本。
  • 谢谢 Seekeer,我相应地改了!

标签: c# windows-services teamcity nuget .net-4.5


【解决方案1】:

NuGet 中内置的启用包还原功能允许您非常轻松地设置工作流的预构建部分。为此,请在 Visual Studio 的解决方案资源管理器中右键单击解决方案节点,然后单击启用 NuGet 包还原选项。请注意,您需要在系统上安装 NuGet Visual Studio 扩展。如果您这样做了,但您仍然没有看到此菜单项,则您已经启用了此选项,或者您的解决方案目录中有一个名为 .nuget 的文件夹。

设置该选项后,您现在可以删除软件包安装目录的所有子文件夹,默认情况下为 $(SolutionDir)\packages,但 repositories.config 文件除外,您的解决方案仍应能正确编译。在编译期间,您应该会在 Visual Studio 输出窗口中看到 NuGet 安装跟踪,并且您应该会看到所需的 NuGet 包也重新出现在包安装目录中。

另见Using Nuget without committing packages

【讨论】:

【解决方案2】:

重申更新 2。如果您在这里偶然发现 TeamCity 不下载 NuGet 包的快速修复,请尝试更改此行

<RequireRestoreConsent Condition=" '$(RequireRestoreConsent)' != 'false' ">true</RequireRestoreConsent>

到这一行

<RequireRestoreConsent Condition=" '$(RequireRestoreConsent)' != 'true' ">false</RequireRestoreConsent>

在您的 NuGet.targets 文件中,它应该可以工作。

【讨论】:

  • 我没有 nuget.target。它不应该用于包还原。
【解决方案3】:

在 TeamCity v8 中,我能够使用 TC 中的环境变量解决“还原包”错误。

见:

http://johanleino.wordpress.com/2013/03/19/using-teamcity-for-asp-net-development-part-2/

http://confluence.jetbrains.com/display/TCD7/Configuring+Build+Parameters#ConfiguringBuildParameters-SystemPropertiesandEnvironmentVariables

在项目级别将env.EnableNuGetPackageRestore 设置为“true”作为环境变量将解决所有构建配置的问题。这样做感觉比编辑 NuGet.targets 文件好一点。

【讨论】:

    【解决方案4】:

    看看这个帖子:http://johanleino.wordpress.com/2013/06/17/making-use-of-teamcitys-nuget-capabilities-part-2/

    如那里所述,我添加了第一个构建步骤“NuGet Installer”,进行了一些配置,现在包会自动恢复。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多