恢复nuget包的最佳方法是什么?

时间:2017-07-04 08:18:38

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

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

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

从VisualStudio构建解决方案时,此方法很有效。它设法读取此nuget.config文件并成功恢复所有包。

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

我认为有两种可能的方法可以解决这个问题:

  1. Nuget installer构建步骤中配置自定义程序包源。
  2. 在构建计算机上的AppData文件夹中的Nuget.config中配置我的自定义程序包源。
  3. 我不喜欢这种方法,因为他们没有为我提供从TeamCity和VisualStudio构建的单一配置。

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

1 个答案:

答案 0 :(得分: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文件的任何引用。这些设置通常如下所示:

  5. 之后,将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 ”字段,您可以填写该字段以让团队城市使用自定义Feed:

    enter image description here

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

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

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