簡體   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