【问题标题】:What is the best way to restore nuget packages?恢复 nuget 包的最佳方法是什么?
【发布时间】:2017-07-04 08:18:37
【问题描述】:

我有一个使用自定义 nuget 包源的解决方案。现在我在位于我的解决方案文件附近的Nuget.config 文件中指定它们(以便从源代码管理中签出):

|- MySoulution.sln
|- MyProjFolder
|- .nuget
   |- Nuget.exe
   |- Nuget.config
   |- Nuget.targets

这在从 VisualStudio 构建解决方案时效果很好。它设法读取了这个nuget.config 文件并成功恢复了所有包。

现在我将我的解决方案配置为从 TeamCity 构建。所以我添加了项目配置和构建步骤来构建它。但默认情况下,TeamCity 不会恢复 nuget 包。因此,我添加了一个单独的Nuget installer 构建步骤,为我的解决方案运行 nuget(特定版本)恢复。但问题是它似乎没有在解决方案文件旁边的.nuget 文件夹中看到来自Nuget.config 文件的自定义nuget 包源。

我看到了两种可能的方法来克服这个问题:

  1. Nuget installer 构建步骤中配置我的自定义包源。
  2. 在构建机器的 AppData 文件夹中的 Nuget.config 中配置我的自定义包源。

我不喜欢这两种方法,因为它们没有为我提供从 TeamCity 和 VisualStudio 构建的单一配置。

总而言之,问题是:如何配置我的自定义包源,以便它们在 TeamCity 和 VisualStudio 中都可见,而无需我在不同的地方多次配置它们?

【问题讨论】:

  • 在解决方案的 .nuget 文件夹中的 nuget.config 中配置包源。您必须指定 nuget 使用解决方案文件夹中的 nuget.config,默认情况下使用 appData 中的一个
  • docs.microsoft.com/en-us/nuget/tools/… 使用“ConfigFile”选项
  • 您使用的是什么版本的 Visual Studio 和 NuGet?如果你使用的是 NuGet 2.7 或更高版本,并且有一个仍为 MSBuild 集成还原配置的解决方案,则解决方案的 .nuget 文件夹中可能有旧版本的 nuget.exe。这将导致构建失败,并显示您未同意恢复包的错误。建议使用 MSBuild 集成还原迁移任何项目,以使用 NuGet 2.7 及更高版本的自动还原功能。 docs.microsoft.com/en-us/nuget/consume-packages/…
  • @Leo-MSFT VS15 和 nuget 4.1.0。迁移到“MSBuild-integrated restore”意味着根本没有.nuget 文件夹,对吧?如何指定自定义 nuget 源?
  • @D.J.嗯,看起来是一个很有前途的解决方案。会试一试

标签: c# visual-studio nuget nuget-package nuget-package-restore


【解决方案1】:

如何配置我的自定义包源,以便它们在 TeamCity 和 VisualStudio 中都可见,而无需我在不同的地方多次配置它们?

如您所知,如果您不想在不同的地方多次配置自定义 nuget 源,您可以在 NuGet.config 中设置自定义 nuget 源并将其添加到源代码管理中。所以问题的关键是为什么 NuGet 不尊重解决方案文件旁边 .nuget 文件夹中 Nuget.config 文件中的自定义 nuget 包源。

正如我的评论一样,如果您使用的是 NuGet 2.7 或更高版本,并且有一个仍然为 MSBuild 集成还原配置的解决方案,您可能在解决方案的 .nuget 文件夹中有旧版本的 nuget.exe。这将导致构建失败,并显示您未同意恢复包的错误。 为避免此问题,建议迁移任何使用 MSBuild 集成恢复的项目以使用 NuGet 2.7 及更高版本的自动恢复功能,您可以关注the process,如下所示:

  1. 关闭 Visual Studio 以避免文件潜在的文件锁定和冲突。

  2. 如果使用 TFS: 从解决方案的 .nuget 文件夹中删除 nuget.exe 和 NuGet.targets,并从解决方案工作区中删除这些文件。 使用 DisableSourceControlIntegration 设置保留 Nuget.Config,如使用 Team Foundation 版本控制省略包中所述。

  3. 如果不使用 TFS: 从解决方案和解决方案工作区中删除 .nuget 文件夹。

  4. 编辑解决方案中的每个项目文件,删除元素,并删除对 NuGet.targets 文件的所有引用。这些设置通常如下所示:

然后将 NuGet.config 放在带有自定义 NuGet 源的解决方案文件旁边:

<?xml version="1.0" encoding="utf-8"?>
   <configuration>
     <solution>
       <add key="disableSourceControlIntegration" value="true" />
     </solution>

    <packageSources>
      <add key="CustomSource" value="http://CustomSource/nuget" />
    </packageSources>

    <packageRestore>
      <add key="enabled" value="True" />
    </packageRestore>

  </configuration>

现在,在 NuGet 安装程序步骤中,现在有一个“Package Sources”字段,您可以填写该字段以让团队城市使用自定义提要:

您可以参考此文档NuGet Package Restore with TeamCity了解更多详细信息。

另外,我们还可以specify custom feed in the NuGet.targets .nuget 文件夹中的文件(我还没验证):

<ItemGroup Condition=" '$(PackageSources)' == '' ">
    <PackageSource Include="https://nuget.org/api/v2/" />
    <PackageSource Include="\\MyShare" />
    <PackageSource Include="http://MyServer/" />
</ItemGroup>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-20
    • 1970-01-01
    • 2016-04-13
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多