You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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的安装/卸载专用脚本:

  1. 替换脚本文件
    将init.ps1重命名为install.ps1,这个脚本会在每次包被安装到项目时执行,无需重启VS。如果需要在卸载时执行操作,可额外创建uninstall.ps1脚本。

  2. 更新.nuspec文件
    修改<files>节点,确保新脚本被正确打包:

    <files>
      <!-- 原有文件保持不变 -->
      <file src="tools\install.ps1" target="tools" />
      <!-- 若有卸载需求,添加以下行 -->
      <!-- <file src="tools\uninstall.ps1" target="tools" /> -->
    </files>
    
  3. 重新打包NuGet包
    执行打包命令重新生成包:

    nuget pack YourProject.nuspec -OutputDirectory .
    

修改完成后,每次将包安装到项目时,install.ps1都会自动执行。

内容的提问来源于stack exchange,提问作者Valentin Marie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 19:32:47