[英]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.