【问题标题】:How to automatically update NuGet packages to latest available version如何自动将 NuGet 包更新到最新可用版本
【发布时间】:2012-03-20 21:03:44
【问题描述】:

我有两个存储库,我需要从另一个存储库中的一个存储库编译的库。我不想手动检查 repo1 以获取更新的库,然后复制/提交到 repo2,因为那很愚蠢。我有 repo1 在必要库的每个版本上构建 NuGet 包,并将它们发布到内部 NuGet 服务器。然后 repo2 中的项目可以引用这些 NuGet 包,并且一切都(几乎)正常工作。

最后一个障碍是自动更新 repo2 项目中的 NuGet 包。由于我不知道 repo1 中的库何时会更新(而且我不应该这样做),我希望 repo2 中的项目上的某种构建事件会自动更新 NuGet 包。我目前只有一个预构建事件,但由于 packages.config 文件包含已安装包的版本号,我不断在 repo2 中获取修改后的文件(packages.config 文件得到更新)。

所以我的问题是:在不破坏我的 repo2 VCS​​ 的情况下自动升级 NuGet 包的好方法是什么? ScottGu 说Here(在 cmets 中)可以将包升级挂钩到 CI 构建,但他没有具体说明如何以及我当前的解决方案是混乱的。有没有我缺少的内置方式?还是有更好的解决方法?

【问题讨论】:

  • 小心。这些库可能会改变和破坏您的软件。 blog.heroku.com/archives/2011/6/28/…
  • 这就是我们的自动化测试套件的用途:)
  • @themilkyninja 你有没有找到合适的解决方案?我面临着完全相同的问题。
  • 不。我们最终一起跳过了 NuGet 并手动进行。但是,我们现在最多有 4 个不同的依赖项,因此我们将再次设置所有 NuGet 内容,并在情况发生变化时手动构建包。
  • 那么如果...在其中一个构建步骤中有一个脚本可以解析来自包提要(如this)的版本,然后在package.config 中修改相应的包版本?

标签: continuous-integration nuget nuget-package


【解决方案1】:

您可能可以利用 NuGet 包还原功能(这里有一些信息:http://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages

在项目构建时,它调用“nuget.exe -install”从 packages.config 重新安装包。 我还没有尝试过,但是您可以以相同的方式将更新命令添加到 nuget.targets 文件中。 (您必须同时调用 nuget.exe 更新和现有的 nuget.exe 安装)。

【讨论】:

  • 我对此进行了调查,并且仅将包恢复到解决方案级别的包文件夹(而不是实际项目)。我也不想将文件签入项目,nuget.exe updatenuget.ext install 都不会将所有文件重新放入项目中。基本上我要找的是this feature
【解决方案2】:

这解释了如何通过 MSBuild 进行操作

http://netitude.bc3tech.net/2014/11/28/auto-update-your-nuget-packages-at-build-time/

<Target Name="UpdatePackages" DependsOnTargets="CheckPrerequisites">
   <Exec Command="$(UpdateCommand)"
      Condition="'$(OS)' != 'Windows_NT' And Exists('$(PackagesConfig)')" />

   <Exec Command="$(UpdateCommand)"
      LogStandardErrorAsError="true"
      Condition="'$(OS)' == 'Windows_NT' And Exists('$(PackagesConfig)')" />
</Target>


<!-- Commands -->
<UpdateCommand>$(NuGetCommand) update "$(PackagesConfig)" -source "$(PackageSources)" -id AutoUpdater $(NonInteractiveSwitch)</UpdateCommand>
<RestoreCommand>$(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)"  $(NonInteractiveSwitch) $(RequireConsentSwitch) -solutionDir $(PaddedSolutionDir)</RestoreCommand>

<BuildCommand>$(NuGetCommand) pack "$(ProjectPath)" -Properties "Configuration=$(Configuration);Platform=$(Platform)" $(NonInteractiveSwitch) -OutputDirectory "$(PackageOutputDir)" -symbols</BuildCommand>

<!-- We need to ensure packages are restored prior to assembly resolve -->
<BuildDependsOn Condition="$(RestorePackages) == 'true'">
    RestorePackages;
    UpdatePackages;
    $(BuildDependsOn);
</BuildDependsOn>

【讨论】:

    【解决方案3】:

    您可以修改 .cspoj 文件以执行“BeforeBuild”目标,如下所示:

    <Target Name="BeforeBuild">
      <Exec Command="&quot;$(SolutionDir).nuget\NuGet&quot; update &quot;$(ProjectDir)packages.config&quot; -Id your.package.id" />
    </Target>
    

    请注意:您的解决方案目录中需要有“Nuget.exe”

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    相关资源
    最近更新 更多