У меня есть решение, состоящее из нескольких проектов, некоторые из которых ссылаются на пакеты NuGet. Есть веб-сайт, но также есть сервис, который должен быть построен для x86 или x64; сервис - это то, что я сейчас пытаюсь построить.
Мы находимся на TFS 2013; для этого конкретного решения я использую Visual Studio 2015.
Проверены «Разрешить NuGet загружать отсутствующие пакеты» и «Автоматически проверять отсутствующие пакеты во время сборки Visual Studio».
Я запускал NuGet 3.4.4, я обновился до 4.6.2.
Я могу нормально строить из Visual Studio. Но автоматические сборки на сервере терпят неудачу; но что еще более важно, он также не работает, если я пытаюсь запустить MSBuild локально Похож на этот вопрос и этот .
Насколько я могу судить, шаблон выпуска - правильная версия (12), но я не думаю, что это проблема с сервером, так как я не могу собрать и локально.
Пакеты не находятся под контролем исходного кода.
У меня есть nuget.config
в корневой папке решения; Ранее он находился в папке .nuget
под корнем решения. У меня нет (и никогда не было) nuget.exe
или nuget.targets
в папке nuget
. Вот конфиг:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<clear />
<add key="NuGetCache" value="\\BuildServer\NuGetPackages" />
<add key="NuGetV2" value="https://www.nuget.org/api/v2/" />
</packageSources>
<packageRestore>
<add key="enabled" value="True" />
<add key="automatic" value="True" />
</packageRestore>
<solution>
<add key="disableSourceControlIntegration" value="true"/>
</solution>
</configuration>
Если я (вручную) очистил пакеты и запустил
MSBuild /p:Configuration=Release;Platform=x64
(из командной строки VS2015) происходит сбой, поскольку он не может найти указанные пакеты.
Как предлагается в этом ответе , я удалил цели EnsureNuGetPackageBuildImports
из своих проектов; у них не было тега RestorePackages
или импорта для nuget.targets
.
Я попытался добавить событие перед сборкой, чтобы выполнить восстановление пакета (да, я понимаю, что это «старый» способ действий)
"C:\Program Files (x86)\NuGet\nuget.exe" restore -ConfigFile "$(SolutionDir)nuget.config" -PackagesDirectory "$(SolutionDir)packages"
... но он постоянно терпит неудачу («Команда завершилась с кодом 1»). Если я скопирую командную строку NuGet из выходных данных MSBuild и выполню ее самостоятельно, это будет успешно.
Я заметил одну странную вещь: в событии перед сборкой NuGet говорит: «Папка d: \ path \ to \ solution \ project1 \ bin \ Release-x64 не содержит файл msbuild solution или packages.config для восстановить". Я не уверен, почему он ищет их в выходной папке.
У меня есть обходной путь для этого. У нас есть сетевой ресурс, настроенный для использования в качестве своего рода кэша пакетов. Если я отредактирую файлы проекта вручную и изменим каждую ссылку так, чтобы HintPath
указывал на \\BuildServer\NuGetPackages\
, а не ..\packages\
, сборка будет успешной. Но это некрасиво и, что более важно, значительно снижает производительность Visual Studio.