TL; DR
При сборке на TeamCity Nuget восстанавливает DLL-файл пакета .NET Standard 2.0 в корневой каталог пакета, а не в его специфичную для фреймворка библиотеку.папка.Это приводит к тому, что Visual Studio не может найти сборку.
Подробнее:
Мы создали пакет Nuget для netstandard2.0 и опубликовали его.У нас есть решение с кучей проектов .NET Framework 4.6.1, некоторые из которых зависят от вышеупомянутого пакета Nuget (с допустимыми записями в соответствующих файлах package.config)
Распаковка пакета Nuget, его содержимогоявляются:
foo.nupkg
|- lib
| |- netstandard2.0
| |- foo.dll
|- package
|- _rels
|- foo.nuspec
Обратите внимание, что DLL находится внутри каталога netstandard2.0.Соответственно, ссылка и путь к этой dll в файлах csproj выглядят так:
<Reference Include="foo, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\foo.1.0.22\lib\netstandard2.0\foo.dll</HintPath>
</Reference>
И действительно, на моих машинах разработки, работающих под VS2017 15.9.3 и Nuget 4.9.2, пакет dll восстанавливается именно там, гдедолжно быть, внутри папки netstandard2.0, восстановить ли я с помощью VS или с помощью nuget.exe.
Однако при попытке восстановить пакеты и построить это решение в TeamCity с помощью установщика Nuget (4.9.2) и типах запуска Visual Studio 2017, компиляция завершается неудачно, поскольку не удается найти пространство имен foo
.При более глубоком рассмотрении журналов шаг ResolveAssemblyReference в msbuild предупреждает, что он не может разрешить foo.dll:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\bin\Microsoft.Common.CurrentVersion.targets(2110, 5): warning MSB3245: Could not resolve this reference. Could not locate the assembly "foo, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL". Check to make sure the assembly exists on disk. If this reference is required by your code, you may get compilation errors
For SearchPath "{CandidateAssemblyFiles}".
...
For SearchPath "{HintPathFromItem}".
Considered "..\packages\foo.1.0.22\lib\netstandard2.0\foo.dll", but it didn't exist.
For SearchPath "{TargetFrameworkDirectory}".
...
Не удается найти dll в каталоге lib / netstandard2.0.Я посмотрел каталог post-restore каталога пакетов и подкаталог foo выглядит следующим образом:
packages/foo
|- foo.dll
|- foo.pdb
|- foo.nupkg
|- foo.deps.json
Папка lib ни netstandard2.0 отсутствует, а dll находится в корне пакета.
Добавление шага сборки, который явно создает папку lib \ netstandard2.0 до компиляции, решает проблему, но это явно не поддерживаемое решение.Мне действительно нужно понять, что мы делаем неправильно, и почему Nuget не восстанавливает эту dll в папке lib.
И ошеломляющая вещь: другие dll .NET Standard 2.0 восстанавливаются в ихкаталоги пакета lib / netstandard2.0.Это только пакет foo
, который не работает правильно.
Устранение неполадок уже было предпринято:
Вот шаги по устранению неполадок, которые я пробовал, но без разницы:
- Понизил версию Nuget, которую мы используем в TeamCity, до 3.2
- Включен аргумент
-NoCache
для Nuget - Ориентирован на зависимые проекты в .NET Framework 4.7.2(вместо 4.6.1)
- Используется как
nuget restore
, так и nuget install
У меня закончились идеи и волосы, чтобы вытащить.Любая помощь приветствуется.