Как автоматически обновить пакеты NuGet до последней доступной версии

У меня есть два хранилища, и мне нужны скомпилированные библиотеки из одного хранилища в другом. Я не хочу вручную проверять repo1 на наличие обновленных библиотек и копировать / фиксировать в repo2, потому что это глупо. У меня есть repo1, который собирает пакеты NuGet для каждой сборки необходимых библиотек и публикует их на внутреннем сервере NuGet. Затем проекты в repo2 могут ссылаться на эти пакеты NuGet, и все (почти) работает.

Последнее препятствие для этого - автоматическое обновление пакетов NuGet в проектах repo2. Так как я не знаю, когда библиотеки в repo1 будут обновлены (и мне это не нужно было), я хотел бы иметь какое-то событие сборки проектов в repo2, которое автоматически обновит пакеты NuGet. В настоящее время у меня просто есть событие предварительной сборки, но поскольку файлы packages.config содержат номер версии установленного пакета, я продолжаю получать измененные файлы в repo2 (файлы packages.config обновляются).

Итак, мой вопрос: каков хороший способ автоматического обновления пакетов NuGet без взлома моего repo2 VCS? ScottGu говорит здесь (в комментариях), что можно подключить обновления пакетов до сборок CI, но он не указывает, как и мое текущее решение является грязным. Есть ли встроенный способ, по которому я скучаю? Или лучше обходные пути?

3 ответа

Возможно, вы могли бы использовать функцию восстановления пакета NuGet (немного информации здесь: http://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages)

При сборке проекта он вызывает "nuget.exe -install" для переустановки пакетов из packages.config. Я не пробовал, но вы можете добавить команду Update в файл nuget.targets таким же образом. (Вам нужно вызвать обновление nuget.exe и установить существующий nuget.exe).

Это объясняет, как сделать это через 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>

Вы можете изменить ваш файл.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" в каталоге ваших решений.

В Visual Studio Tools-> Nuget Package Manager -> Manage Packages for Solution -> Updates Tab

Если есть обновления для установки, есть опция Проверить все с кнопкой Обновить.

Другие вопросы по тегам