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
文件,或者仅在目标项目的构建过程中引用它,以便对程序集进行签名?SignAssembly
+ AssemblyOriginatorKeyFile
属性?上下文,我有几个我想使用强名称命名的项目(对于传统项目和SDK样式格式项目,有20多个)。我想创建一个NuGet包,以便在...
另一方面,CI / CD管道比以前更好。 SDK .csproj
文件仍然只是XML文件,许多CI / CD工具都具有在预构建步骤中修改文件的功能。根据环境的不同,您也许还可以包括一个将.snk
复制到内部版本的步骤(本地文件副本,git子模块,其他源文件夹等),从而将整个功能从NuGet转移到CI / CD(可以说是)无论如何还是更好