Я пытаюсь перейти на использование 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 до того, как он будет упакован / сжат?
В основном меня интересует внедрение зависимостей только тогда, когда "пакет""цель выполнена, поэтому она игнорируется / инертна во всех остальных целях.