12

我一直在将我们的库项目转换为 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>

我将此 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>

这是我放置在一个文件夹中的 NuGet.config,它应该在构建服务器的层次结构中被拾取:

<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 文件中,当开发人员在他们的本地机器上工作时,我们需要立即对库更新进行任何更改,但是构建服务器只会在期间与我们的本地提要对话团队建设过程。

它是否正确?

另一个想法...... 在与同事讨论后,我们想出了另一个在实践中可能更有效的解决方案。我们决定在 AvalonDock 项目上对其进行建模。当您下载源代码并打开该项目的解决方案时,您不仅会看到构建 UI 控件的代码,还会看到一个使用所述控件的所有功能的示例项目。

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

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

这种方法的普遍看法是什么?

4

1 回答 1

12

您绝对可以一次使用多个存储库。这里的重要部分是您需要定义您希望它们使用的顺序。还原/安装包时,NuGet 将首先查找第一个存储库,如果未找到,它将扫描第二个存储库,依此类推。

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

乍一看,您的方法看起来不错,尽管您也可以使用.nuget\NuGet.targetsNuGet 包还原随附的文件来寻求 MSBuild 解决方案(无需这些配置修改)。通过将它们添加到元素中来定义您的提要<PackageSources>,然后(可能基于构建配置调试 | 发布)您可以切换要在<RestoreCommand>.

于 2013-02-12T07:33:36.203 回答