使用 Nuget、自定义包源和重复包自动恢复包 names/versions

Automatic Package Restore with Nuget, custom package sources, and duplicate package names/versions

我们正试图将所有依赖项的提取移动到 Nuget 中。我们使用我们自己的自定义包源,以及默认的 nuget.org 源。我们有自定义包恰好具有相同的 name/version # 存在于 nuget.org.

上的包

因此,在 VS2013 和 VS2015 中,我更新了包管理器设置以具有两个包源(自定义然后 nuget.org)并启用了 nuget 2.7+ 自动包恢复。我还在我们的解决方案的根目录中添加了一个 nuget.config 文件,其中包含包源:

<!-- nuget.config -->
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <config>
    <add key="repositorypath" value="c:\nuget\packages" />
  </config>
  <packagesources>
    <add key="customsource" value="http://custom.url/nuget" />
    <add key="nuget.org" value="https://www.nuget.org/api/v2/" />
  </packagesources>
</configuration>

我 运行 遇到这样一种情况,当我在我的盒子上用 VS2013 重建解决方案时,它会从自定义源中正常提取所有具有重复 names/versions 的包。但是如果我们在另一个人的机器上重建解决方案,它似乎会忽略自定义源并尝试从 nuget.org 中提取所有内容,无论他们的机器上的设置是否相同。

当我尝试在 VS2015 中重建解决方案时,它似乎忽略了自定义源并从 nuget.org.

中提取任何具有重复 names/versions 的包

如果我在命令行上使用 nuget.exe 2.8.2,只要我将自定义源保持在列表的第一位,一切都会按预期工作并且包可以正常提取。如果我在命令行上使用 nuget.exe 3.3.0,我必须将自定义源作为源列表中的最后一个,以便从我的自定义源中提取重复的包。如果自定义源在列表中排在第一位,则 nuget 3.3.0 只会从 nuget.org.

恢复所有重复包

在我的测试中,我在尝试任何恢复之前清除了所有 nuget 缓存。

有没有人运行遇到过这个问题,如果有,你是如何解决这个问题的?

短期内,尝试打开包管理器控制台,选择合适的包源,然后恢复包。

从长远来看,尝试在您的内部提要中为包添加前缀。例如,不使用 package,而是使用 <your company name>.package。这应该可以解决您的包命名问题。

另一件通常是个好主意的事情是将您的包签入源代码管理。这样,任何获得最新版本的开发人员都可以使用尽可能少的配置来正确构建代码。有关此理念的更多信息,请访问 many blog posts。基本上,模型是,如果您需要它来构建您的代码,那么 签入 。然后,您只需担心从正确的提要更新包,而不是依赖每个开发人员知道从哪个提要下载项目。

好吧,我似乎已经解决了这个问题。首先,我将位于解决方案根目录中的 nuget.config 文件修改为以下内容:

<!-- nuget.config -->
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <config>
    <add key="repositorypath" value="c:\nuget\packages" />
  </config>
  <packageRestore>
    <add key="enabled" value="True" />
    <add key="automatic" value="True" />
  </packageRestore>
  <packagesources>
    <add key="customsource" value="http://custom.url/nuget" />
    <add key="nuget.org" value="https://www.nuget.org/api/v2/" />
  </packagesources>
  <activePackageSource>
    <add key="All" value="(Aggregate source)" />
  </activePackageSource>
</configuration>

接下来,我在 C:\Users\ExitusLSU\AppData\Roaming\Nuget 下找到另一个 nuget.config,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageRestore>
    <add key="enabled" value="True" />
    <add key="automatic" value="True" />
  </packageRestore>
  <packagesources>
    <add key="customsource" value="http://custom.url/nuget" />
    <add key="nuget.org" value="https://www.nuget.org/api/v2/" />
  </packagesources>
  <activePackageSource>
    <add key="nuget.org" value="https://www.nuget.org/api/v2/" />
  </activePackageSource>
</configuration>

似乎 Visual Studio,在启动 nuget 包恢复时正在读取此文件并忽略位于解决方案中的 nuget.config 文件。我注意到,每当我尝试对 Visual Studio 中的包源进行重新排序时,解决方案 nuget.config 文件中的源顺序从未得到更新。我删除了 "roaming" nuget.config 文件并重新启动 Visual Studio。 "roaming" nuget.config 已重新创建,但文件中基本上没有任何内容。现在,解决方案 nuget.config 得到了正确更新,我的包源也被正确读取了。

感谢大家花时间回答我的问题并提供一些帮助!