Nuget Restore не создает каталог lib для некоторых пакетов - PullRequest
0 голосов
/ 30 января 2019

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

У меня закончились идеи и волосы, чтобы вытащить.Любая помощь приветствуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...