我正在创建一个包含TypeScript依赖项的NuGet包。。。node_modules之类的东西。我不想将node_modules作为包的一部分,所以我更喜欢在包安装完成后执行npm install
。我已经在一个测试网站上安装了这个包,如果我手动执行npm install
,它就可以工作了。
我可以把它放在自述文件中,在软件包完成后执行npm install
,但我更喜欢在安装完成后自动执行。有什么办法可以做到这一点吗?
历史上,我们可以编写Install.ps1PowerShell脚本来在安装NuGet包时调用某些操作。然而,从NuGet版本3起,此功能不再受支持:
Powershell脚本支持被修改为不再执行安装和卸载脚本,但init脚本仍在执行。
上面描述的Init.ps1脚本允许我们在有人安装我们的包时执行操作。尽管上面的博客文章表明我们仍然可以在我们的包中使用Init.ps1脚本,但缺乏该功能的最新文档和NuGet开发人员的评论似乎表明,Init.ps1也被弃用,并且该行为在未来可能不可用。如果我们考虑到NuGet还旨在为Mono/.NET Core项目支持Mac和Linux,并且这些系统还没有像Windows一样普遍支持PowerShell(但它们最终可能会),那么这是有道理的。
出于这些原因,我现在不能建议我们使用NuGet的内置功能来自动化软件包的安装后步骤。运行npm install
的脚本还必须在PATH
中缺少或不可用npm程序的系统上处理挑战,并且一些用户可能不喜欢包安装和运行arbitrary代码的想法。我认为,对于有问题的项目来说,简单地指示README中的最终用户在安装后运行npm install
是公平的。安装后步骤更复杂的项目可以指示最终用户运行执行每个步骤的脚本。如果您仍然希望尝试使用Init.ps1,请继续阅读:
当前的NuGet文档省略了Init.ps1的信息,但2007年的旧文档包含以下描述:
Init.ps1在解决方案中首次安装包时运行。如果将同一个包安装到解决方案中的其他项目中,则在这些安装过程中不会运行脚本。每次打开解决方案时,脚本也会运行。例如,如果安装程序包,关闭Visual Studio,然后启动Visual Studio并打开解决方案,Init.ps1脚本将再次运行
这些文件应该位于软件包的tools目录中。
因此,我们可以在tools/目录中为我们的包创建一个Init.ps1文件,该文件可能如下所示:
param($installPath, $toolsPath, $package, $project)
Set-Location PathToProjectWithNodeDependencies
npm install
然后生成NuGet包。基于NuGet约定的脚本的param()
语句提供以下值:
$installPath
是软件包安装的路径$toolsPath
是包下工具目录的路径$package
是您的包裹$project
是要将应用程序安装到的项目。注意:这在Init.ps1中将为null。它没有对特定项目的引用,因为它在解决方案级别运行
因为每当我们加载解决方案时都会运行此脚本,所以它可能会降低Visual Studio的速度。我们可以在脚本中添加一个条件,在运行npm之前检查包是否已安装。请注意,此功能仅限于从Visual Studio或Package Manager控制台运行的NuGet操作,并且可能无法使用独立的NuGet CLI程序,因为这些脚本与项目和解决方案相耦合。
- 讨论将Install.ps1重新引入NuGet