我正尝试迁移到使用MSBuild Pack支持,以使用.csproj生成项目NuGet包,其中在开发过程中使用本地.dll来构建项目,但需要替换/交换它们以在生成的文件中引用外部NuGet包。使用MSBuild打包项目时使用.nuspec。

我可以找到的该用例的最接近记录的示例是Replacing one library from a restore graph,其中建议您可以替换外部NuGet参考:

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


它将覆盖程序包以引用本地.dll,而不是:

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


我正在尝试做类似的事情,项目应该针对本地.dll's构建,该本地ExcludeAssets=All是从依赖的TeamCity / CI构建中作为工件注入的:

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


但是,根据文档使用ExcludeAssets="compile"时:

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


PackageReference不会在生成的依赖项列表中导出,例如:

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


我最接近获得首选行为的方法是使用<dependency/>,因此我的本地项目不会针对它构建,除非此行为也会在.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中注入自定义依赖项?

有什么办法可以像上面那样手动声明,所以仅在MSBuild / NuGet打包项目时使用它?否则,是否有一种方法可以对生成的.nuspec进行一些XML转换,以便在打包/压缩之前可以在.nuspec中操纵XML?

基本上,我只对在运行“ pack”目标时注入依赖项感兴趣,因此在所有其他目标中都将其忽略/插入。

最佳答案

有趣的问题,当我环顾四周寻找答案时
我在Stackoverflow中找到了另一个讨论

在注释中的某处-表示pack命令仅适用于4.6及更高版本的框架项目-不适用于4.5。

基于Microsoft的this博客条目,.Net Standard 2.0必须匹配4.6.1。

关于c# - 如何在MSBuild NuGet包生成的.nuspec中注入(inject)自定义依赖项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53762903/

10-10 13:53