如何在自定义NuGet软件包安装后添加/更新目标项目的属性(SDK样式格式?)>

问题描述 投票:0回答:1

Context

我有几个不同的项目(对于传统项目和SDK样式格式项目,有20个以上),我希望使用强名称。我想创建一个NuGet程序包,以便在安装到这些目标项目中的任何一个时,它会自动负责添加相关属性。

仅应在目标的.csproj中添加所需的属性(SignAssembly + AssemblyOriginatorKeyFile)。该项目的实际建设是CI pipielines的工作。

当前方法

到目前为止,我已经创建了一个具有以下结构的文件夹:

- content
    - Key.snk

- tools
    - install.ps1

- build
    - Package.props

- Package.nuspec

content文件夹包含强名称密钥文件(.snk),tools文件夹包含将在安装NuGet软件包时运行的powershell脚本。 build文件夹包含要注入到目标.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>

最后,要生成软件包,我在文件夹根目录中运行了此命令NuGet pack Package.nuspec。>>

问题

以上对于传统格式.csproj的项目效果很好。它将Key.snk添加到目标项目的根目录和所需的属性。但是,此方法确实不能使用SDK样式格式的项目。它无法更新.csproj或将内容复制到目标根目录。浏览互联网后,我读了official docs,并遇到了一些堆栈溢出答案。它们都指向使用更新的SDK样式格式项目使用PackageReference并且只能修改构建输出的方向。

因为对于较新样式的项目,不建议在NuGet安装时运行install.ps1脚本。我尝试添加.props文件,以便它可以将属性注入到目标.csproj中,但这也不起作用。

因此,对于新的SDK样式项目:

    如何在目标项目的根目录中包含Key.snk文件,或者仅在目标项目的构建过程中引用它,以便对程序集进行签名?
  • 如何在目标.csproj文件中添加/更新SignAssembly + AssemblyOriginatorKeyFile属性?
  • 通常,针对此特定问题上下文是否有更好的方法?
  • 上下文,我有几个我想使用强名称命名的项目(对于传统项目和SDK样式格式项目,有20多个)。我想创建一个NuGet包,以便在...

简短的答案是,没有任何便捷的方法可以从NuGet软件包中执行此操作。您只是无法再运行任何Powershell,也没有计划添加它。

另一方面,CI / CD管道比以前更好。 SDK .csproj文件仍然只是XML文件,许多CI / CD工具都具有在预构建步骤中修改文件的功能。根据环境的不同,您也许还可以包括一个将.snk复制到内部版本的步骤(本地文件副本,git子模块,其他源文件夹等),从而将整个功能从NuGet转移到CI / CD(可以说是)无论如何还是更好

c# nuget
1个回答
0
投票
简短的答案是,没有任何便捷的方法可以从NuGet软件包中执行此操作。您只是无法再运行任何Powershell,也没有计划添加它。
© www.soinside.com 2019 - 2024. All rights reserved.