У нас есть два отдельных .NET-решения:
- Запуск сборки для первого решения дает наш конечный продукт: куча DLL. Эти DLL файлы предоставляются нашим клиентам через NuGet-пакет.
- Второе решение служит решением для тестирования продукта: для него установлен пакет NuGet, он встроен и выполнен - таким образом, он использует наш продукт точно так же, как и наши клиенты.
Задача здесь состоит в том, что должен быть способ, которым наш последний пакет NuGet автоматически устанавливается в решение для тестирования продукта, желательно во время сборки этого тестового решения для продуктов.
На основе идей из аналогичного вопроса я догадался, что настроил решение для тестирования продукта:
- Сначала я включил восстановление пакета NuGet. Это позволяет полностью избавиться от каталога "packages" от VCS, так как пакет с версией, определенной в файле packages.config, будет автоматически загружен NuGet перед сборкой.
- Затем я добавил следующее событие для сборки в Visual Studio:
$(SolutionDir).nuget\nuget update -prerelease $(ProjectDir)packages.config
. Это позволяет мне использовать последнюю версию нашего пакета NuGet во время сборки.
В настоящее время я использую описанный выше сценарий для запуска локальных сборников с использованием Visual Studio и автоматических сборок с использованием TeamCity. Решение, похоже, работает для обоих сценариев с первого взгляда, но на самом деле оно не дает ожидаемого результата: при построении решения для тестирования продукта в каталоге bin
я не получаю последней версии DLL, только последняя версия.
Проблема заключается в том, что хотя команда nuget update
обновляет все, как ожидалось, включая файл packages.config
и .csproj
, их новый контент не собирается сборкой, поэтому - как мне кажется, настройки HintPath из файла .csproj
по-прежнему отражают состояние "перед сборкой", поэтому старые библиотеки DLL копируются в каталог bin
. Я предполагаю, что файл .csproj
обрабатывается только один раз: перед запуском события предварительной сборки и изменения, сделанные событием предварительной сборки, игнорируются до следующей сборки.
Я рассмотрел следующие решения:
- По-видимому, предварительная сборка не является достаточной. Если бы была еще более ранняя точка, я мог бы вставить команду
nuget update
, мое решение, вероятно, сработало бы. - Я прочитал, что могу переопределить HintPath-s в файле .csproj, указав ReferencePath. Но я сомневаюсь, что я мог бы легко понять правильный путь, или я мог бы установить его достаточно рано, чтобы сборка подхватила его.
- В качестве обходного решения я мог бы запустить сборки дважды: дублировать шаг сборки для решения тестового продукта в TeamCity, и я всегда мог бы построить решение дважды локально в Visual Studio.
Кто-нибудь выяснил, как автоматически обновлять пакет NuGet до последней версии во время сборки?