簡體   English   中英

如何在自定義 NuGet package 安裝時添加/更新目標項目的屬性(SDK 樣式格式)?

[英]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文件或僅在目標項目構建期間引用它以便對程序集進行簽名?
  • 如何在 target.csproj 文件中添加/更新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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM