Экспресс-транзитивная зависимость в MSBuild без импорта PackageReference

У меня есть проект MySdk.csproj, который я упаковываю во время сборки через пакет dotnet. Я хочу сказать, что этот проект имеет транзитивную зависимость от Trans.nupkg, но на самом деле я не хочу импортировать все активы из Trans.nupkg во время сборки MySdk.csproj. Я ДЕЙСТВИТЕЛЬНО хочу, чтобы потребитель (назовем его Consumer.csproj) MySdk.nupkg получил все активы от Trans.nupkg.

Если я ExcludeAssets для Trans.nupkg из MySdk.nupkg, то nuspec и nupkg для MySdk.nupkg отражают исключение, и когда Consumer.csproj ссылается на MySdk.nupkg, он не получит переходные активы.

Есть ли способ сделать это?

Спасибо.

ОБНОВИТЬ:

Если я попытаюсь установить для PrivateAssets значение None и ExcludeAssets для сборки ссылки Trans.nupkg из MySdk.csproj следующим образом:

<PackageReference Include="Trans" Version="1.0.*" PrivateAssets="None" ExcludeAssets="build" />

сгенерированный nuspec в MySdk.nupkg выглядит так:

<dependency id="Trans" version="1.0.0" include="Runtime,Compile,Native,ContentFiles,Analyzers" />

это означает, что когда Consumer.csproj добавляет такую ​​ссылку:

<PackageReference Include="MySdk" Version="1.0.0" />

переходная ссылка обратно на Trans.nupkg не будет включать пользовательские цели сборки, что противоположно тому, что я пытаюсь сделать.


person Jeff    schedule 20.05.2018    source источник


Ответы (1)


В то время как ExcludeAssets определяет, какие ресурсы будет потреблять MySdk.csproj, PrivateAssets указывает, какие ресурсы не будут передаваться через транзитивную зависимость.

По умолчанию для PrivateAssets используется значение contentfiles;analyzers;build, поэтому Consumer.csproj не будет получать встроенные ресурсы (файлы .pros/.targets), анализаторы roslyn и файлы содержимого по умолчанию.

Чтобы изменить это, укажите ссылку на параметр пакета Trans с PrivateAssets на none, что заставит Consumer.csproj вести себя так, как если бы он напрямую ссылался на пакет Trans (пример также исключает зависимости времени сборки от проекта MySdk):

<PackageReference Include="trans" PrivateAssets="none" ExcludeAssets="contentfiles;build" />

Дополнительные сведения см. в разделе Управление зависимыми активами.

person Martin Ullrich    schedule 20.05.2018
comment
Правильно, но проблема в другом. Я ДЕЙСТВИТЕЛЬНО хочу, чтобы Consumer.csproj получил ресурсы сборки от Trans.nupkg. Я НЕ хочу, чтобы MySdk.csproj запускал ресурсы сборки из Trans.csproj при сборке. По сути, я хочу сказать, что nuspec для MySdk должен иметь зависимость от Trans.nupkg... но я не хочу использовать ресурсы сборки Trans.nupkg во время сборки MySdk.csproj. Я бы просто использовал nuspec напрямую и запускал пакет nuget через CLI, но это не работает для проектов в стиле Sdk — это известная ошибка. - person Jeff; 20.05.2018
comment
это точная цель комбинации PrivateAssets=none (перенаправлять все ресурсы в потребляющие проекты) и ExcludeAssets=contentfiles;build (не использовать логику сборки только этого проекта) - person Martin Ullrich; 20.05.2018
comment
Я пробовал это ... не работает: / см. обновленный ответ - person Jeff; 21.05.2018
comment
Любое обновление по этому поводу, потому что у меня также было ожидание, что на самом деле PrivateAssets управляет показом для проекта, в котором он установлен, а ExcludeAssets также управляет им для всех потребляющих проектов. Но видимо оказалось это не факт. У вас есть новости по этому поводу? - person fl0tschi; 22.01.2020
comment
PrivateAssets в основном останавливает транзитивное течение вещей, а Include-/ExcludeAssets контролирует то, что получает текущий проект (отдельно). Если у вас есть другой и конкретный сценарий, вы можете открыть новый вопрос. - person Martin Ullrich; 22.01.2020
comment
Я сделаю это. Похоже, что это плохо работает в проектах, отличных от SDK, в части PrivateAssets. Протестировал это уже с небольшим проектом, но, возможно, есть альтернатива. Посмотрим - person fl0tschi; 07.02.2020