[英]How to control output of a nuget package dependencies during build
我想在我的应用程序中支持向后兼容性。 简单地说 - 一个应用程序需要使用不同版本的 dll 工作,具体取决于应用程序在运行时获得的标志。
我已经简化了所有内容并创建了一个包含 2 个项目的测试解决方案。 每个项目都有自己的相同 nuget package 版本。
我选择System.Drawing.Common
因为它没有依赖项。
ClassLibrary1
包含版本4.5.0
的System.Drawing.Common
。
ClassLibrary2
包含版本6.0.0
的System.Drawing.Common
。
两个项目具有相同的 output 路径:
<OutputPath>..\DEBUG\</OutputPath>
当我构建我的解决方案时,我的 output 文件夹中只有一个System.Drawing.Common.dll
:
因为两个 dll 都有一个名称,只有版本不同。
下图中所需的行为:
这个想法是控制 nuget package 依赖项的 output 。 你知道我怎么能做到这一点吗?
PS所有其他逻辑-根据版本等解决依赖关系超出了这个问题的scope。
这不是 package 分辨率在 .NET 中的工作方式,您将获得每个 package 的一个版本,该版本在恢复时决定。
如果你有一个非常小众的问题,可能会有一些时髦的选择,但听起来你可能正试图以一种不常见的方式解决一个常见的问题,这通常是一个坏主意。
通常,对于向后兼容性的问题,有责任在库的发布者而不是库的使用者身上,以确保通过不进行破坏 API 更改来确保一切正常。
这是可能的。 首先,您需要将GeneratePathProperty
添加到csproj
文件中的PackageReference
元素
<ItemGroup>
<PackageReference Include="System.Drawing.Common">
<Version>4.5.0</Version>
<GeneratePathProperty>true</GeneratePathProperty>
</PackageReference>
</ItemGroup>
它允许我们使用$(PkgSystem_Drawing_Common)
变量,该变量包含指向 nuget package 的路径。
然后我们需要创建一个msbuild targets
文件
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="CopyNugetDll" BeforeTargets="BeforeCompile" Outputs="System.Drawing.Common.dll">
<XmlPeek XmlInputPath="$(ProjectPath)" Query="Project/ItemGroup/PackageReference[@Include='System.Drawing.Common']/Version/text()">
<Output TaskParameter="Result" PropertyName="NugetPackageVersion" />
</XmlPeek>
<ItemGroup>
<NugetrDll Include="$(PkgSystem_Drawing_Common)\lib\net461\System.Drawing.Common.dll" />
</ItemGroup>
<Message Text="Copying @(NugetrDll) to $(OutDir)" Importance="high" />
<Exec Command="copy $(PkgSystem_Drawing_Common)\lib\net461\System.Drawing.Common.dll $(OutDir)\System.Drawing.Common.$(NugetPackageVersion).dll" />
</Target>
</Project>
这里使用xpath
我们 select 版本来自project.assets.json
文件并将其保存在NugetPackageVersion
变量中。 Exec copy
用于将 dll 复制到具有特定前缀的特定位置,该特定前缀包含来自NugetPackageVersion
变量的值。
最后,您需要将msbuild targets
文件包含到项目中
<Import Project="CopyDll.targets" />
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.