Как добавить пользовательскую зависимость в сгенерированный пакет MSBuild NuGet .nuspec - PullRequest
0 голосов
/ 13 декабря 2018

Я пытаюсь перейти на использование MSBuild Pack Поддержка использования .csproj для создания пакета NuGet проектов, где во время разработки локальные .dll используются для сборки проекта, но их необходимо заменить / заменитьссылаться на внешний пакет NuGet в сгенерированном .nuspec при использовании MSBuild для «упаковки» проекта.

Ближайший документированный пример этого варианта использования, который я смог найти, - Замена одной библиотеки из графа восстановления , где предлагается заменить внешнюю ссылку NuGet:

<PackageReference Include="Newtonsoft.Json" Version="9.0.1">
  <ExcludeAssets>All</ExcludeAssets>
</PackageReference>

, который переопределяет пакет для ссылки на локальный .dll вместо:

<Reference Include="Newtonsoft.Json.dll" />

Я пытаюсь сделать что-то подобное, когда проект должен быть построен на локальных .dll's, которые быливнедряется как артефакт из зависимой сборки TeamCity / CI:

<Reference Include="..\..\lib\net45\ServiceStack.Interfaces.dll" />
<Reference Include="..\..\lib\net45\ServiceStack.Text.dll" />
<Reference Include="..\..\lib\net45\ServiceStack.Common.dll" />

Но при использовании ExcludeAssets=All согласно документации:

<PackageReference Include="ServiceStack.Common" Version="5.0.0">
  <ExcludeAssets>All</ExcludeAssets>
</PackageReference>

PackageReference не экспортируется всгенерированный список зависимостей, например:

<group targetFramework=".NETFramework4.5" />

Самое близкое к получению предпочтительного поведения - использование ExcludeAssets="compile", поэтому мой локальный проект не строится на нем, за исключением того, что это поведение также экспортируется в.nuspec:

<group targetFramework=".NETFramework4.5">
  <dependency id="ServiceStack.Common" version="5.4.0" exclude="Compile,Build,Analyzers" />
</group>

Я только хочу избежать построения против него локально, но экспортировать его как обычную зависимость.Другая проблема, связанная с этим подходом, заключается в том, что он мне нужен для ссылки на пакет, который еще не был опубликован в NuGet (поскольку все пакеты публикуются в режиме блокировки), например:

<!-- v5.5.0 is the new version to publish -->
<PackageReference Include="ServiceStack.Common" Version="5.5.0" ExcludeAssets="compile"/>

Сборка завершается неудачночто он не может найти неопубликованный пакет:

[NU1102] Unable to find package ServiceStack.Common with version (>= 5.5.0)

Фактически мне нужно как-то «вставить» точные зависимости и версию, которые мне нужны, в сгенерированный .nuspec, чтобы он был включен в сгенерированный список зависимостей .nuspec,Например:

<group targetFramework="net45">
  <dependency id="ServiceStack.Common" version="5.5.0" />
</group>
<group targetFramework=".netstandard2.0">
  <dependency id="ServiceStack.Common" version="5.5.0" />
</group>

Как мы можем внедрить пользовательскую зависимость в сгенерированном MSBuild .nuspec?

Есть ли какой-то способ, которым я могу вручную объявить <dependency/>, как указано выше, так что он используется только когда MSBuild /NuGet упаковывает проект?Иначе есть ли способ применить какое-то преобразование XML к сгенерированному .nuspec, чтобы я мог манипулировать XML в .nuspec до того, как он будет упакован / сжат?

В основном меня интересует внедрение зависимостей только тогда, когда "пакет""цель выполнена, поэтому она игнорируется / инертна во всех остальных целях.

1 Ответ

0 голосов
/ 13 декабря 2018

Интересный вопрос, и когда я искал ответы, я нашел другое обсуждение в Stackoverflow

Где в одном из комментариев - было указание, что команда pack работает только с frameworkпроекты с 4.6 и выше - не 4.5.

.Net Standard 2.0 должен соответствовать 4.6.1 на основе этой записи в блоге от Microsoft

...