有没有办法为每个解决方案进行 NuGet 包源设置?

Is there a way to make NuGet Package Source settings per solution?

有谁知道让 Visual Studio 为每个解决方案而不是跨所有解决方案应用 NuGet 包源配置的方法?我一直遇到版本控制问题,因为我从事多个项目,每个项目都有自己的私有 NuGet 存储库。不断记住哪个 NuGet 存储库属于哪个项目并返回并将正确的存储库应用到正确的项目是一件痛苦的事情。

TLDR:是的

NuGet 使用包源的分层应用程序,从 Windows 用户配置文件级别的 NuGet.config 开始,然后从文件路径的根开始应用越来越细化的配置包含您的解决方案,最后以包含您的解决方案文件的目录结束。

所以这就是我设法弄清楚的 - 由一位乐于助人的 Twitterer 向我指出此文档:

https://docs.nuget.org/consume/nuget-config-file

当您在 Visual Studio 的 Tools > NuGet Package Manager > Package Manager Settings: Package Sources 选项中编辑 NuGet 包源时,它会默认将这些更改应用到 NuGet.config 目录中的 NuGet.config 文件.要在每个解决方案(或每组解决方案)的基础上覆盖这些设置,您需要在一个或多个解决方案路径的某个位置添加一个战略性放置的 NuGet.config 文件。

如果您阅读 NuGet 文档,一切都会变得清晰,我在下面提供的解决方案将快速允许您为单个 Visual Studio 解决方案指定配置:

  1. 导航到 %APPDATA%\NuGet 并获取 NuGet.config
  2. 的副本
  3. 将副本转储到您的解决方案的根目录 - 即 Application.sln 所在的位置。
  4. 通过编辑副本以仅包含与此解决方案相关的 NuGet 包源来覆盖应用于您的用户配置文件的默认值 - 例如,私有 NuGet 源包含此解决方案的专有包,但不应该应用于其他项目 - 例如:
<?xml version="1.0" encoding="utf-8"?>
<configuration>

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

  <activePackageSource>
    <add key="All" value="(Aggregate source)" />
  </activePackageSource>

  <packageSources>

    <!-- Ditch all the Global NuGet package sources we only want a 
         single private NuGet repo for this project -->
    <clear />

    <!-- Add the private NuGet package source for this solution -->
    <add key="My Private NuGet Server" value="http://myprivatenuget.com:8080/nuget" />

  </packageSources>

  <disabledPackageSources>

    <!-- Add any package sources to ignore here using the same keys as 
         defined in the packageSources list above-->

    <!--<add key="nuget.org" value="true" />-->

    <add key="Microsoft and .NET" value="true" />

  </disabledPackageSources>

</configuration>

如果您希望一个配置应用于多个解决方案,请确保您的解决方案文件夹都包含在一个公共目录中,并将与这些解决方案相关的包源的 NuGet.config 放在该公共目录中,确保使用这些包源的项目的任何解决方案文件夹不包含在此公共文件夹中。

我想添加到 provided by BenAlabaster。我遇到了相反的问题:

该公司在全球范围内配置了他们的自定义私有 nuget 提要,默认用于所有解决方案,我想使用 public nuget feed. 制作一个“原型”应用程序

有了这个(在该解决方案的目录中),public nuget 提要仅适用于我的特定解决方案,同时将公司的提要保留为所有其他解决方案的默认值:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <!-- Ditch all eventually upwards configured (private) feeds from an (enterprise) environment -->
    <clear />
    <!-- Make sure we use the public nuget -->
    <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
  </packageSources>
  <packageRestore>
    <add key="enabled" value="True" />
    <add key="automatic" value="True" />
  </packageRestore>
  <bindingRedirects>
    <add key="skip" value="False" />
  </bindingRedirects>
  <disabledPackageSources>
    <!-- Ditch all eventually upwards configured (private) feeds from an (enterprise) environment -->
    <clear />
  </disabledPackageSources>
</configuration>

关键是清除所有向上禁用的提要,因为他们故意在 %APPDATA%\NuGet 的 NuGet.config 中禁用了 public 提要。