NuGet包还原-.NuGet文件夹在解决方案中-提交到存储库?

NuGet包还原-.NuGet文件夹在解决方案中-提交到存储库?,nuget,Nuget,启用NuGet package restore时,会将以下内容添加到我的解决方案中: /.nuget /.nuget/nuget.exe /.nuget/nuget.targets 由于这些是我的解决方案的一部分,将解决方案提交到我的存储库而不包含其中任何一个文件意味着我的解决方案中将缺少引用,但删除文件夹或其中任何一个文件意味着未启用NuGet package restore 考虑到设置包还原的部分目的是为了不必将二进制文件提交到存储库,那么强制NuGet.exe进入解决方案的目的是什么 假设

启用NuGet package restore时,会将以下内容添加到我的解决方案中:

/.nuget
/.nuget/nuget.exe
/.nuget/nuget.targets

由于这些是我的解决方案的一部分,将解决方案提交到我的存储库而不包含其中任何一个文件意味着我的解决方案中将缺少引用,但删除文件夹或其中任何一个文件意味着未启用NuGet package restore

考虑到设置包还原的部分目的是为了不必将二进制文件提交到存储库,那么强制NuGet.exe进入解决方案的目的是什么


假设将一个小的.exe提交到存储库是为了消除提交其他二进制文件的需要而付出的小代价吗?还是我应该将这些从存储库中排除,并告诉第一次签出我的存储库的开发人员去启用包还原?如果持续集成在我的解决方案中遇到缺少的引用,该怎么办?

将.nuget文件夹提交到存储库的原因是,您可以使用启用此功能时安装的nuget.exe版本将解决方案设置为使用包还原

您的项目文件依赖于使用nuget.exe的nuget.targets MSBuild指令,并且这两个文件被视为链接在一起,因为MSBuild指令使用nuget.exe API。完全有可能在某一天得到不同版本的nuget.exe和nuget.targets。它在引擎盖下使用NuGet.Build和NuGet.Commandline包。这也是为什么包恢复通常只为解决方案设置一次,而不是由每个开发人员单独设置的原因

此外,您不需要在每个生成服务器上安装nuget.exe,并且您的生成服务器可以使用不同版本的nuget.exe生成解决方案,这是一个不需要额外努力的附加好处。是的,我们可以认为这是一个很小的价格支付: 如果CI遇到缺少的引用,请检查以下内容:

  • 生成服务器无法访问NuGet包源
  • 生成服务器在NuGet包源上找不到NuGet包(请检查它是否在那里,或者是否指向正确的包源)

    • 您不必将nuget.exe提交到源代码管理。NuGet.targets会从NuGet.org下载最新的NuGet.exe(如果该文件丢失)。

      如果您遵循@Richard Szalay的答案(未提交NuGet.exe),并且由于某些原因Visual Studio不会自动下载NuGet.exe,请确保在NuGet.targets文件中将以下设置为true

      <!-- Download NuGet.exe if it does not already exist --> 
      <DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">true</DownloadNuGetExe>
      
      
      真的
      

      关闭VS解决方案,重新打开并构建它。Visual Studio现在应该自动下载nuget.exe。

      对于
      .gitignore
      ,请添加以下行

      .nuget/
      !.nuget/packages.config
      

      现在,在获得包恢复许可后,您还需要检查是否已设置。这确实是自NuGet v2.0以来的一个新选项。您可以关闭它并仍然签入您的nuget.exe(例如,当生成服务器没有internet访问权限时,您可能希望这样做)。@XavierDecoster没有internet的生成服务器无法使用nuget下载包,更不用说nuget.exe了。从字面上说,构建服务器可能一无是处。@JerricLynsJohn这不是真的。您可以使用内部NuGet服务器或简单的网络共享从中还原NuGet软件包。@Xavier Decoster同意这一点,尽管我从未这样使用过NuGet。我的项目主要围绕着它的使用