Я запускаю сборку CI на контроллере сборки TFS, подключенном к VS Online. У меня возникла проблема «Не удалось разрешить эту ссылку» для пакета NuGet, и я наблюдал поведение, которого раньше не видел:
Локально пакет загружается в packages\FluentValidation.5.5.0
, тогда как на сервере он загружается в packages\FluentValidation.5.5.0.0
.
Packages.config:
<package id="FluentValidation" version="5.5.0" targetFramework="net45" userInstalled="true" />
.csproj файл $(SolutionDir)
для общего проекта - работает для всех остальных проектов:
<Reference Include="FluentValidation, Version=5.5.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\FluentValidation.5.5.0\lib\Net40\FluentValidation.dll</HintPath>
<SpecificVersion>False</SpecificVersion>
<Private>True</Private>
</Reference>
Восстановление пакета Nuget включено, поэтому, если я локально удалю пакет из папки пакетов и перестрою - все будет нормально.
Теперь о сервере CI. Журнал диагностики сборки состояния:
Установка FluentValidation 5.5.0.0. ... Успешно установлен FluentValidation 5.5.0.0.
Но дальше в журнале сборки:
16> C: \ Program Files (x86) \ MSBuild \ 12.0 \ bin \ amd64 \ Microsoft.Common.CurrentVersion.targets (1697,5): предупреждение MSB3245: не удалось разрешить эту ссылку. Не удалось найти сборку «FluentValidation». Убедитесь, что сборка существует на диске. Если эта ссылка требуется для вашего кода, вы можете получить ошибки компиляции. [C: \ Builds \ 24353 ... stuff ... \ projectfile.csproj] Для SearchPath "{HintPathFromItem}". Считается "C: \ Builds \ 24353 ... stuff ... \ packages \ FluentValidation.5.5.0 \ lib \ Net40 \ FluentValidation.dll",
Как и ожидалось - в этой папке нет пакета
C:\Builds\24353\... stuff ...\packages\FluentValidation.5.5.0\lib\Net40\
.
Однако - это потому, что он загружается в другую папку на сервере CI:
C:\Builds\24353\... stuff ...\packages\FluentValidation.5.5.0.0\lib\Net40\
.
(обратите внимание на дополнительный .0 после имени папки пакета).
Я понятия не имею, откуда взялись эти дополнительные .0. Кроме того, похоже, что проект игнорирует путь сборки. На сервере CI есть VS 2013, и я обновил NuGet на коробке, не помогло. Есть только одно место, где в ссылке есть 5.5.0.0 (с двумя нулями). Я удалил завершающие .0. Решение по-прежнему строится локально, но не на CI.
Обновление. Добавление второго пути к подсказке в файле .csproj, похоже, исправляет сборку на сервере CI, но нарушает ее локально. Я действительно не могу понять, почему это v5.0.0 локально и v5.0.0.0 на сервере CI.
PS Я сообщил об этом как об ошибке: https://github.com/NuGet/Home/issues/504