繁体   English   中英

如何在构建期间控制 nuget package 依赖项的 output

[英]How to control output of a nuget package dependencies during build

我想在我的应用程序中支持向后兼容性。 简单地说 - 一个应用程序需要使用不同版本的 dll 工作,具体取决于应用程序在运行时获得的标志。

我已经简化了所有内容并创建了一个包含 2 个项目的测试解决方案。 每个项目都有自己的相同 nuget package 版本。

测试溶液

我选择System.Drawing.Common因为它没有依赖项。

ClassLibrary1包含版本4.5.0System.Drawing.Common

ClassLibrary2包含版本6.0.0System.Drawing.Common

两个项目具有相同的 output 路径:

<OutputPath>..\DEBUG\</OutputPath>

当我构建我的解决方案时,我的 output 文件夹中只有一个System.Drawing.Common.dll 电流输出

因为两个 dll 都有一个名称,只有版本不同。

下图中所需的行为:

  1. 根据版本将nuget package依赖分布到不同的文件夹中。 期望的输出

  2. 根据版本为 nuget package 依赖项添加后缀。 期望的输出

这个想法是控制 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM