Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 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

В Visual Studio Tools-> Диспетчер пакетов Nuget → Управление пакетами для решения → Вкладка "Обновления"

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

Update button

Ответ 4

Вы можете изменить свой .cspoj файл, чтобы выполнить цель "BeforeBuild" следующим образом:

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

Обратите внимание, что: u'll нужно иметь "Nuget.exe" в каталоге решений ur