是否可以同时使用本地NuGet存储库和远程存储库

是否可以同时使用本地NuGet存储库和远程存储库,nuget,Nuget,我一直在将我们的库项目转换为NuGet包,并将它们托管在内部NuGet提要上。这非常有效,减少了开发人员重新创建助手类和“重新发明轮子”的工作量。另一个巨大的好处是,其他团队现在可以使用我们项目中“发布”的库。基本上,到目前为止这是一场巨大的胜利 我们面临的唯一问题是本地构建。我们想做的是在我们的消费项目中测试库,然后将构建推送到NuGet提要。我们遇到了一个问题,因为使用这些库的项目被设置为使用本地提要(构建服务器上的包还原允许我们的主干使用最新的“发布”库构建) 有没有办法让本地构建从本地存

我一直在将我们的库项目转换为NuGet包,并将它们托管在内部NuGet提要上。这非常有效,减少了开发人员重新创建助手类和“重新发明轮子”的工作量。另一个巨大的好处是,其他团队现在可以使用我们项目中“发布”的库。基本上,到目前为止这是一场巨大的胜利

我们面临的唯一问题是本地构建。我们想做的是在我们的消费项目中测试库,然后将构建推送到NuGet提要。我们遇到了一个问题,因为使用这些库的项目被设置为使用本地提要(构建服务器上的包还原允许我们的主干使用最新的“发布”库构建)

有没有办法让本地构建从本地存储库中提取?我已经开始为创建本地包文件的库处理构建后任务。使用NuGet.config,我想我应该能够屏蔽某些存储库,然后屏蔽构建服务器上的配置文件。我的理论是,当使用本地构建时,应该选择本地存储库,并在构建服务器上使用提要

这可能吗?是否有其他人记录了如何做到这一点

以下是我用于创建本地包的构建后任务:

  <PropertyGroup>
    <PackOutputDir>$([System.IO.Path]::Combine($(SolutionDir), "..\Prerelease"))</PackOutputDir>
    <BuildSpecCommand>$(NuGetCommand) spec $(ProjectFileName) -force -NonInteractive -Verbosity detailed</BuildSpecCommand>
    <PackCommand>$(NuGetCommand) pack $(ProjectFileName) -OutputDirectory "$(PackOutputDir)"</PackCommand>
  </PropertyGroup>
  <Target Name="AfterBuild" Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <Exec Command="$(BuildSpecCommand)" LogStandardErrorAsError="true" Condition=" '$(OS)' == 'Windows_NT' " />
    <Exec Command="$(PackCommand)" LogStandardErrorAsError="true" Condition=" '$(OS)' == 'Windows_NT' " />
  </Target>

$([System.IO.Path]::合并($(SolutionDir),“.\Prerelease”))
$(NuGetCommand)规范$(ProjectFileName)-强制-非交互-详细详细信息
$(NuGetCommand)包$(项目文件名)-OutputDirectory“$(PackOutputDir)”
我将这个NuGet.config放在团队项目的根目录下。此文件隐藏在生成服务器上:

<configuration>
  <packageSources>
    <add key="NuGet official package source" value="https://nuget.org/api/v2/" />
    <add key="TestSource" value="Source\Prerelease" />
  </packageSources>
  <disabledPackageSources>
    <add key="LocalNuGetFeed" value="LocalNuGetFeed" />
  </disabledPackageSources>
  <activePackageSource>
    <add key="All" value="(Aggregate source)"  />
  </activePackageSource>
</configuration>
<configuration>
  <packageSources>
    <add key="NuGet official package source" value="https://nuget.org/api/v2/" />
    <add key="LocalNuGetFeed" value="http://team2:12345/nuget" />
  </packageSources>
  <disabledPackageSources>
  </disabledPackageSources>
  <activePackageSource>
    <add key="All" value="(Aggregate source)"  />
  </activePackageSource>
</configuration>

以下是我放在一个文件夹中的NuGet.config,该文件夹应该在构建服务器的层次结构中获取:

<configuration>
  <packageSources>
    <add key="NuGet official package source" value="https://nuget.org/api/v2/" />
    <add key="TestSource" value="Source\Prerelease" />
  </packageSources>
  <disabledPackageSources>
    <add key="LocalNuGetFeed" value="LocalNuGetFeed" />
  </disabledPackageSources>
  <activePackageSource>
    <add key="All" value="(Aggregate source)"  />
  </activePackageSource>
</configuration>
<configuration>
  <packageSources>
    <add key="NuGet official package source" value="https://nuget.org/api/v2/" />
    <add key="LocalNuGetFeed" value="http://team2:12345/nuget" />
  </packageSources>
  <disabledPackageSources>
  </disabledPackageSources>
  <activePackageSource>
    <add key="All" value="(Aggregate source)"  />
  </activePackageSource>
</configuration>

更新 根据提供的答案,我更改了nuget.targets文件。理想情况下,我不想这样做,但如果这是实现我想要实现的目标的最佳方式,那么我对这种类型的编辑很满意

  <ItemGroup Condition=" '$(PackageSources)' == '' And '$Configuration' == 'Release'">
    <PackageSource Include="https://nuget.org/api/v2/" />
    <PackageSource Include="http://team2:12345/nuget/" />
  </ItemGroup>
  <ItemGroup Condition=" '$(PackageSources)' == '' And '$Configuration' != 'Release'">
    <PackageSource Include="https://nuget.org/api/v2/" />
    <PackageSource Include="C:\temp\NuGet\Prerelease" />
  </ItemGroup>

这里的想法是使用前面为库项目发布的构建任务,以便将它们的包输出到磁盘上的临时文件夹。对于那些我们需要在开发人员在本地机器上工作时立即对库进行任何更改的项目,上面的代码应该位于nuget.targets文件中,但是在团队构建过程中,构建服务器将只与本地提要通信

这是正确的吗

另一个想法。。。 在与同事讨论后,我们提出了另一个在实践中可能更有效的解决方案。我们决定以阿瓦隆托克项目为模型。当您下载源代码并打开该项目的解决方案时,您不仅可以看到构建UI控件的代码,还可以看到使用所述控件的所有功能的示例项目

他的想法是,在我们的库项目中,代码只是C#库,单元测试应该足够有效,可以覆盖任何问题。此外,推送这些库的构建是封闭的,这意味着只有在构建(和测试)完成时才应用签入

对于UI控件,他指出了上述AvalonDock示例。包括一个利用了所有控制的项目应该可以缓解大多数问题。由于UI控件的单元测试是有限的,所以在提交代码和启动构建过程之前,开发人员仍有责任检查测试项目中的控件


对这种方法的一般看法是什么?

您肯定可以同时使用多个存储库。这里重要的一点是,您需要定义使用它们的顺序。在恢复/安装包时,NuGet将首先查看第一个存储库,如果找不到,它将扫描第二个存储库,依此类推

如果您需要本地存储库优先于“已发布”存储库,则需要确保本地存储库是列表中的第一个存储库

乍一看,您的方法看起来还不错,不过您也可以使用nuget软件包还原附带的
.nuget\nuget.targets
文件使用MSBuild解决方案(无需这些配置修改)。
通过在
元素中添加提要来定义提要,然后(可能基于Build configuration Debug | Release),您可以切换要在
中使用的repo。我更新了问题并添加了我认为您建议的内容。请看一下这一点和我添加的其他评论,并让我知道您的意见。我注意到您仍然在两种构建配置中包含官方的nuget提要,因此您的构建服务器也将在nuget.org上查找包。事实上,因为它是列表中的第一个,它将首先在nuget.org上查找,然后在第二个pkg源上查找。不确定那是你想要的?为什么不将nuget.org依赖项复制到本地存储库中呢?我们在解决方案中使用第三方项目,如log4net。我想为这些包使用nuget存储库。我的目标是,如果我的开发人员无需任何其他依赖项设置就可以开始编写代码。您使用的是pkg restore,因此无论您使用什么源,提取源代码和构建源代码都应该“正常工作”:)如果您的内部依赖项比nuget.org上的更多,为了提高速度,您可能需要颠倒packagesources的顺序,因为查找内部pkg的几率要高于外部pkg。