[英]How to add/update properties of a target project (SDK Style Format) upon custom NuGet package install?
語境
我有幾個不同的項目(傳統和 SDK 樣式格式項目都有 20 多個),我想有一個強大的命名。 我想創建一個 NuGet package ,這樣當安裝在任何這些目標項目上時,它會自動處理添加相關屬性。
它應該只在目標的.csproj 中添加所需的屬性( SignAssembly
+ AssemblyOriginatorKeyFile
)。 項目的實際構建是 CI 管道工作。
當前方法
到目前為止,我已經創建了一個具有以下結構的文件夾:
- content
- Key.snk
- tools
- install.ps1
- build
- Package.props
- Package.nuspec
content
文件夾包含強名稱密鑰文件 (.snk), tools
文件夾包含 powershell 腳本,該腳本將在安裝 NuGet package 時運行。 build
文件夾包含要注入到 target.csproj 中的屬性。
這是install.ps1
的樣子:
param($installPath, $toolsPath, $package, $project)
$snkFilename = "Key.snk"
#Add the .snk file
$project.ProjectItems.AddFromFile($snkFilename)
#Set target .csproj properties
$project.Properties.Item("SignAssembly").Value = "True"
$project.Properties.Item("AssemblyOriginatorKeyFile").Value = $snkFilename
#Save the target project
$project.Save()
下面是構建文件夾中的Package.props
文件的樣子:
<?xml version="1.0" encoding="utf-8" ?>
<Project>
<PropertyGroup>
<AssemblyOriginatorKeyFile>Key.snk</AssemblyOriginatorKeyFile>
<SignAssembly>true</SignAssembly>
</PropertyGroup>
<ItemGroup>
<None Include="$(MSBuildThisFileDirectory)content\Key.snk">
<Link>Key.snk</Link>
</None>
</ItemGroup>
</Project>
文件夾根目錄中的Package.nuspec
文件如下所示:
<?xml version="1.0"?>
<package >
<metadata>
<id>Package</id>
<version>1.0.0</version>
<authors>Rithin Chalumuri</authors>
<description>Automatically add Key.snk to the project and sign the assembly with a strong name.</description>
<contentFiles>
<files include="content\Key.snk" buildAction="none" />
</contentFiles>
</metadata>
<files>
<file src="content\Key.snk" target="contentFiles\" />
<file src="content\Key.snk" target="content\" />
<file src="build\**" target="build" />
<file src="tools\**" target="tools" />
</files>
</package>
最后,為了構建 package,我在文件夾根目錄中運行了這個命令NuGet pack Package.nuspec
。
問題
上述方法適用於具有傳統 format.csproj 的項目。 它將Key.snk
添加到目標項目根目錄和所需屬性。 但是這種方法不適用於 SDK 樣式格式的項目。 它無法更新 .csproj 或將內容復制到目標根目錄。
上網后,我閱讀了官方文檔並遇到了一些堆棧溢出的答案。 他們都指向新的 SDK 樣式格式項目使用PackageReference
並且只能修改構建 output 的方向。
由於在 NuGet 安裝上運行的install.ps1
腳本已被新樣式項目棄用。 我已經嘗試添加.props
文件,以便它可以將屬性注入到 target.csproj 中,但這也不起作用。
因此,對於新的 SDK 樣式項目:
Key.snk
文件或僅在目標項目構建期間引用它以便對程序集進行簽名?SignAssembly
+ AssemblyOriginatorKeyFile
屬性?一般來說,對於這個特定的問題上下文是否有更好的方法?
簡短的回答是,不再有從 NuGet package 執行此操作的便捷方法。 您不能再運行任何 powershell 並且沒有計划添加它。
另一方面,CI/CD 管道比以前要好得多。 SDK .csproj
文件仍然只是一個 XML 文件,並且許多 CI/CD 工具包括修改文件作為預構建步驟的能力。 根據環境的不同,您也可以包括將.snk
復制到構建中的步驟(本地文件復制、git 子模塊、附加源文件夾等),從而將整個功能從 NuGet 移動到 CI/CD 可以說更好反正
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.