我可以在安装NuGet包时执行npm install吗?

时间:2017-11-07 20:48:55

标签: npm nuget nuget-package

我正在创建一个NuGet包,其中包含TypeScript依赖项... node_modules。我不想将node_modules包含在包的一部分中,所以我更愿意在包安装完成后执行baseUrl。我已经在测试网站上安装了软件包,如果我手动执行npm install,它就可以运行。

我可以把它放在自述文件中,在程序包完成后执行npm install,但我宁愿在安装完成后自动执行它。有没有办法让这种情况发生?

1 个答案:

答案 0 :(得分:3)

从历史上看,我们可以编写一个 Install.ps1 PowerShell脚本来在安装NuGet包时调用某些操作。但是,从NuGet版本3开始,此功能为no longer supported

  

修改了Powershell脚本支持,不再执行安装和卸载脚本,但仍然执行了init脚本。

上面描述的 Init.ps1 脚本允许我们在某人安装我们的软件包时执行操作。虽然上面的博客文章表明我们仍然可以在我们的软件包中使用 Init.ps1 脚本,但缺少此功能的最新文档和来自NuGet开发人员的comment似乎表明< i> Init.ps1 也已弃用,并且该行为将来可能无法使用。如果我们认为NuGet还旨在支持Mac和Linux for Mono / .NET Core项目,这是有道理的,而且这些系统还没有像Windows一样普遍支持PowerShell(但they may eventually)。

由于这些原因,我现在不建议使用NuGet的内置功能自动执行软件包的安装后步骤。运行npm install的脚本还必须处理缺少 npm 程序或PATH中不可用的系统上的挑战,并且某些用户可能不喜欢该程序包的想法安装and running arbritrary代码。我认为有问题的项目只是指示README中的最终用户在安装后运行npm install是公平的。具有更复杂的安装后步骤的项目可以指示最终用户运行执行每个步骤的脚本。如果您仍想尝试使用 Init.ps1 ,请继续阅读:

current NuGet docs省略了有关 Init.ps1 的信息,但2007年的older documentation包含此说明:

  

Init.ps1在解决方案中第一次安装软件包时运行。如果将相同的软件包安装到解决方案中的其他项目中,则在这些安装期间不会运行该脚本。每次打开解决方案时,脚本也会运行。例如,如果安装软件包,关闭Visual Studio,然后启动Visual Studio并打开解决方案,Init.ps1script将再次运行。
  ...
  这些文件应位于软件包的tools目录中。

因此,我们可以在 tools / 目录中为我们的包创建一个 Init.ps1 文件,该文件可能如下所示:

param($installPath, $toolsPath, $package, $project)

Set-Location Path\To\Project\With\Node\Dependencies
npm install

...然后生成NuGet包。基于NuGet约定的脚本的param()语句提供以下值:

  
      
  • $installPath是您的软件包安装的路径
  •   
  • $toolsPath是包
  • 下工具目录的路径   
  • $package是您的包裹
  •   
  • $project是您要安装应用程序的项目。注意:这在Init.ps1中为null。它没有对特定项目的引用,因为它在解决方案级别运行。
  •   

因为只要我们加载解决方案就会运行此脚本,这可能会降低Visual Studio的速度。我们可以在运行 npm 之前向脚本添加一个检查包是否已安装的条件。请注意,此功能仅限于从Visual Studio或程序包管理器控制台运行的NuGet操作,并且由于这些脚本与项目和解决方案的耦合,可能无法使用独立的NuGet CLI程序。