有没有办法根据解决方案进行NuGet软件包源设置?


83

有谁知道一种使Visual Studio按解决方案而不是跨所有解决方案应用NuGet包源配置的方法吗?我一直遇到版本控制问题,因为我在多个项目中工作,每个项目都有自己的私有NuGet存储库。在***中,很难记住哪个NuGet存储库属于哪个项目,然后回去将正确的项目应用于正确的项目。


不明白你的意思。您只能为所有解决方案配置nuget软件包源。您的package.config文件将包含项目需要的nuget仓库的版本。不要自动更新。您能举一个您想做的事的例子吗?
Shyamal Desai 2015年

1
@Shyamal我在说的是NuGet软件包的来源,而不是软件包本身……我想出了办法。
2015年

Answers:


136

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程序包源时,默认情况下,它将那些更改应用于%APPDATA%\NuGet目录中的NuGet.config文件。要在每个解决方案(或每个解决方案组)的基础上覆盖这些设置,您需要在解决方案路径中的某个位置添加策略性放置的NuGet.config文件。

如果您阅读了NuGet文档,一切将变得很清楚,我在下面提供的解决方案将使您可以快速为单个Visual Studio解决方案指定配置:

  1. 导航到%APPDATA%\ NuGet并获取NuGet.config的副本
  2. 将副本转储到解决方案的根目录中-即Application.sln所在的位置。
  3. 通过编辑副本以仅包含与该解决方案相关的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放在该公共目录中,确保没有“T使用这些包源不包含在该文件夹中常见。


28
感谢BenAlabaster。如果只是想保持简单,则可以使用一个仅包含以下内容的文件:<?xml version="1.0" encoding="utf-8"?> <configuration> <packageSources> <add key="MyCompanyPackageSource" value="\\server\NuGet\MyCompany" /> </packageSources> </configuration>
Rubenisme

13
您可能必须关闭并重新打开Visual Studio才能使这些更改生效。我试图关闭我的解决方案,但这还不够。
杰西

1
好的答案,如果将示例配置缩减为所需的内容,那就更好了。我也尝试了VS2015,@ Jess的注释似乎不再适用,重新打开解决方案后,我便得到了新的软件包源。
danio

5

我想补充一下BenAlabaster提供的出色答案。我有相反的问题:

该公司默认将其自定义私有nuget feed配置为可在所有解决方案上使用,并且我想使用public nuget feed制作“原型”应用。

使用此解决方案(在该解决方案的目录中),公共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中禁用了公共提要。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.