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

我可以在安装NuGet软件包时执行npm安装吗?,npm,nuget,nuget-package,Npm,Nuget,Nuget Package,我正在创建一个NuGet包,其中包含TypeScript依赖项…node_模块之类的东西。我不想将node_模块作为包的一部分,因此我希望在包安装完成后执行npm install。我已经在一个测试网站上安装了这个软件包,如果我手动执行npm install,它就会工作 我可以把它放在自述文件中,在包完成后执行npm安装,但我更喜欢在安装完成后自动执行它。有什么方法可以做到这一点吗?历史上,我们可以编写Install.ps1 PowerShell脚本,在安装NuGet软件包时调用某些操作。但是,从

我正在创建一个NuGet包,其中包含TypeScript依赖项…node_模块之类的东西。我不想将node_模块作为包的一部分,因此我希望在包安装完成后执行
npm install
。我已经在一个测试网站上安装了这个软件包,如果我手动执行
npm install
,它就会工作


我可以把它放在自述文件中,在包完成后执行
npm安装
,但我更喜欢在安装完成后自动执行它。有什么方法可以做到这一点吗?

历史上,我们可以编写Install.ps1 PowerShell脚本,在安装NuGet软件包时调用某些操作。但是,从NuGet版本3开始,此功能是:

Powershell脚本支持已修改为不再执行安装和卸载脚本,但仍会执行初始化脚本

上面描述的Init.ps1脚本允许我们在某人安装我们的包时执行操作。尽管上面的博文表明我们仍然可以在包中使用Init.ps1脚本,但缺少关于此功能的最新文档以及NuGet开发人员的一份声明似乎表明Init.ps1也已被弃用,并且该行为在将来可能不可用。这是有意义的,如果我们认为NuGet的目标是支持Mac和Linux的Muno.NET核心项目,并且这些系统还不包括对PopeS壳类窗口(但是)的普遍支持。 出于这些原因,我现在不建议使用NuGet的内置功能自动化软件包的安装后步骤。运行
npm install
的脚本还必须处理npm程序在
路径中缺失或不可用的系统上遇到的问题,有些用户可能不喜欢包安装任意代码的想法。我认为,对于有问题的项目来说,在自述文件中简单地指示最终用户在安装后运行
npm install
,是公平的。具有更复杂安装后步骤的项目可以指示最终用户运行执行每个步骤的脚本。如果仍希望尝试使用Init.ps1,请继续阅读:

省略关于Init.ps1的信息,但从2007年起包含以下描述:

Init.ps1在解决方案中首次安装包时运行。如果将同一个包安装到解决方案中的其他项目中,则在这些安装过程中不会运行脚本。每次打开解决方案时,脚本也会运行。例如,如果安装软件包,关闭Visual Studio,然后启动Visual Studio并打开解决方案,则Init.ps1script将再次运行。

这些文件应位于软件包的tools目录中

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

param($installPath、$toolsPath、$package、$project)
将位置路径设置为\Project\With\Node\Dependencies
npm安装
…然后生成NuGet包。基于NuGet约定的脚本的
param()
语句提供以下值:

  • $installPath
    是程序包安装的路径
  • $toolsPath
    是程序包下工具目录的路径
  • $package
    是您的软件包吗
  • $project
    是要将应用程序安装到的项目。注意:在Init.ps1中该值为空。它没有对特定项目的引用,因为它在解决方案级别运行
因为每当我们加载解决方案时,该脚本都会运行,所以它可能会减慢Visual Studio的速度。我们可以在脚本中添加一个条件,在运行npm之前检查包是否已安装。请注意,此功能仅限于从Visual Studio或Package Manager控制台运行的NuGet操作,并且可能无法使用独立的NuGet CLI程序,因为这些脚本与项目和解决方案耦合在一起


是的,这正是我所处的位置——没有一种安全的方法不太可能被弃用。到目前为止,更新自述文件似乎是唯一的选择,这真的不太好,因为人们不阅读自述文件。@Chris-希望我能提供更多帮助。这可能不适用于您的软件包,但值得一提的是:也可以通过npm分发软件包,可能作为最终用户的辅助安装选项,这将有效地消除运行
npm install
的需要。这对于私人团队来说也更为可行。