Как автоматически обновлять пакеты 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-сборок, но он не указывает, как и мое текущее решение является беспорядочным. Есть ли встроенный способ, который мне не хватает? Или какие-то улучшения в работе?
Ответы
Ответ 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=""$(SolutionDir).nuget\NuGet" update "$(ProjectDir)packages.config" -Id your.package.id" />
</Target>
Обратите внимание, что: u'll нужно иметь "Nuget.exe" в каталоге решений ur