如何让NuGet每次安装后自动执行tools\init.ps1脚本?
问题
我有一个C# NuGet项目,已创建tools\init.ps1脚本,希望在NuGet安装完成后自动执行操作,脚本通过项目的.nuspec文件嵌入。但发现该脚本并非每次安装都会运行,仅在重启Visual Studio(VS)后安装NuGet时才会触发执行。
复现流程
- 打开VS解决方案
- 选择目标项目
MyProject2并安装NuGet,脚本成功执行:
Added package 'MyProject.1.0.0' to folder 'C:\Users\xxxxx\Documents\Visual Studio 2019\Projects\MySolution\packages' Added package 'MyProject.1.0.0' to 'packages.config' Executing script file 'C:\Users\xxxxx\Documents\Visual Studio 2019\Projects\MySolution\packages\MyProject.1.0.0\tools\init.ps1'... Successfully installed 'MyProject 1.0.0' to MyProject2
- 在项目中卸载该NuGet:
Successfully uninstalled 'MyProject.1.0.0' from MyProject2
- 再次安装该NuGet,脚本未执行:
Added package 'MyProject.1.0.0' to folder 'C:\Users\xxxxx\Documents\Visual Studio 2019\Projects\MySolution\packages' Added package 'MyProject.1.0.0' to 'packages.config' Successfully installed 'MyProject 1.0.0' to MyProject2
已尝试卸载前清除NuGet缓存,但问题依旧。请问如何无需重启VS,让脚本在每次安装后都能执行?
附.nuspec文件内容
<?xml version="1.0" encoding="utf-8"?> <package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd"> <metadata> <id>MyProject</id> <version>1.0.0</version> <authors>Me</authors> <projectUrl>xxxxx</projectUrl> <description>MyProject provides a simple way to to something.</description> <copyright>Copyright ©</copyright> <readme>README.md</readme> <dependencies> <group targetFramework=".NETFramework4.8" /> <group targetFramework=".NETStandard2.1" /> </dependencies> </metadata> <files> <file src="Bridge\*" target="lib\net48" /> <file src="bin\Release\net48\MyProject.dll" target="lib\net48\MyProject.dll" /> <file src="bin\Release\netstandard2.1\MyProject.dll" target="lib\netstandard2.1\MyProject.dll" /> <file src="README.md" target="README.md" /> <file src="tools\init.ps1" target="tools" /> </files> </package>
包安装后的文件夹结构
lib tools README.md MyProject.1.0.0.nupkg
解决方案
问题根源在于init.ps1的执行逻辑:该脚本仅在NuGet包第一次被Visual Studio加载到当前进程时执行一次,后续即使卸载再安装同一版本包,只要VS进程未重启,脚本就不会重复触发。
要实现每次安装都执行脚本,需改用NuGet的安装/卸载专用脚本:
替换脚本文件
将init.ps1重命名为install.ps1,这个脚本会在每次包被安装到项目时执行,无需重启VS。如果需要在卸载时执行操作,可额外创建uninstall.ps1脚本。更新
.nuspec文件
修改<files>节点,确保新脚本被正确打包:<files> <!-- 原有文件保持不变 --> <file src="tools\install.ps1" target="tools" /> <!-- 若有卸载需求,添加以下行 --> <!-- <file src="tools\uninstall.ps1" target="tools" /> --> </files>重新打包NuGet包
执行打包命令重新生成包:nuget pack YourProject.nuspec -OutputDirectory .
修改完成后,每次将包安装到项目时,install.ps1都会自动执行。
内容的提问来源于stack exchange,提问作者Valentin Marie
相关产品推荐
相关产品推荐

