【问题标题】:Is there a way to make NuGet Package Source settings per solution?有没有办法为每个解决方案进行 NuGet 包源设置?
【发布时间】:2016-02-23 05:40:22
【问题描述】:

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

【问题讨论】:

  • 不确定你的意思。您只能为所有解决方案配置 nuget 包源。您的 package.config 文件将包含您的项目所需的 nuget 存储库版本。不要自动更新。你能举一个你想做什么的例子吗?
  • @Shyamal 我说的是 NuGet 包源,而不是包本身……我知道该怎么做。

标签: visual-studio nuget


【解决方案1】:

TLDR:是的

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

这就是我想出的结果——感谢一位乐于助人的 Twitter 用户向我指出这份文件:

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 放在该公共目录中,确保所有解决方案文件夹用于使用这些包源的项目不包含在这个公共文件夹中。

【讨论】:

  • 感谢 BenAlabaster。如果你只是想保持简单,你可以只包含一个文件:&lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;configuration&gt; &lt;packageSources&gt; &lt;add key="MyCompanyPackageSource" value="\\server\NuGet\MyCompany" /&gt; &lt;/packageSources&gt; &lt;/configuration&gt;
  • 您可能必须关闭并重新打开 Visual Studio 才能使这些更改生效。我尝试关闭我的解决方案,但这还不够。
  • 很好的答案,如果示例配置被削减到所需的内容会更好。我也尝试了 VS2015,@Jess 的评论似乎不再适用,重新打开解决方案为我拾取了新的包源。
【解决方案2】:

我想添加到BenAlabaster 提供的the excellent answer。我遇到了一些相反的问题:

该公司在全球范围内配置了他们的自定义私有 nuget 提要以默认用于所有解决方案,我想使用 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 中禁用公共提要。

【讨论】:

    猜你喜欢
    • 2020-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    • 2023-04-03
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    相关资源
    最近更新 更多