如何在单独执行“npm install <package>”后运行安装后脚本

Posted

技术标签:

【中文标题】如何在单独执行“npm install <package>”后运行安装后脚本【英文标题】:How to run a post-install script after individual execution of "npm install <package>" 【发布时间】:2017-11-05 20:16:04 【问题描述】:

我正在维护以下目录结构:

/home/user/Desktop/
                 |-- app/
                 |      |-- package.json
                 |      `-- server.js
                 |-- node/
                 |      |-- bin/
                 |      |      |-- node
                 |      |      `-- npm
                 |      |-- include/
                 |      |-- lib/
                 |      `-- share/
                 |
                 `-- npm.sh

我希望所有本地安装的节点模块都驻留在目录 node 中。也就是说,如果我在app 目录中运行npm install,最初它将在当前目录(app) 中安装模块,然后将node_modules 文件夹移动到名为node 的外部目录中。为此,我编写了一个脚本npm.sh 并将mv(移动)命令放在postinstallpackage.json 脚本中。

这些是文件npm.shpackage.json

npm.sh的内容:

#/bin/bash

export PATH=/home/user/Desktop/node/bin:$PATH
export NODE_PATH=/home/user/Desktop/node/node_modules
export NODE_MODULE_ROOT=/home/user/Desktop/node
/bin/bash

app/package.json的内容:


  "name": "app",
  "version": "1.0.0",
  "scripts": 
    "postinstall": "mv node_modules $NODE_MODULE_ROOT",
    "start": "node server.js"
  ,
  "dependencies": 
    "jwt-simple": "^0.5.1"
  

但问题是:当我执行./npm.sh &amp;&amp; cd app &amp;&amp; npm install 时,一切都按预期进行。但是当我执行npm install jwt-simple 时,postinstall 脚本没有被执行。

有没有办法让它适用于个人 npm install &lt;package&gt; ?或者有没有更好的方法来实现这一点?

【问题讨论】:

【参考方案1】:

我还不能写评论,因为我是新用户,但我想详细说明Niko's answer。

Hook Scripts 功能似乎已经是 removed starting with npm v7.X

因此,为了使用 node_modules/.hooks/postinstall 挂钩,运行 npm v6.X 将是最好的选择。

另外,正如 cmets 中所指出的,有一个问题:Hook Scripts 在 Windows 上无法开箱即用,因为它无法将文件识别为可执行文件,因为它缺少文件扩展名。

一个不太漂亮的解决方法是创建一个postinstall.cmd 和软(或硬/H)将其与mklink postinstall postinstall.cmd 链接

这将确保 Windows 将文件识别为 .cmd 可执行文件以正确运行它。

【讨论】:

【参考方案2】:

你可以在安装包后使用npm hook scripts做一些事情。

创建node_modules/.hooks/postinstall 可执行文件,它也会在npm install &lt;package&gt; 之后运行。

注意:我注意到在 npm 版本 5.1.0 到 6.0.1 之间的 npm 挂钩脚本存在问题。因此,如果您在使用 hooks 时遇到问题,请检查您的 npm 版本并在必要时进行升级。

【讨论】:

脚本将在工作目录设置为包位置的情况下运行。在脚本中使用 $INIT_CWD 来获取运行 npm install &lt;package&gt; 的目录的路径。 这似乎在 Windows 上不起作用(我刚刚尝试过),因为钩子脚本文件名必须完全是“postinstall”,这使得 Windows 无法将其识别为可执行文件(它只是Exit status 1 的错误,并且不运行该文件,无论我是否使用(以前).exe.js.bat.cmd 文件)。有人知道让这种方法在 Windows 上工作的方法吗?【参考方案3】:

对于其他在这里绊倒的人,在安装特定包时,npm 不会在 package.json 中运行 pre/postinstall。您可以在此处查看以供参考,https://npm.community/t/preinstall-npm-hook-doesnt-execute-when-installing-a-specific-package/2505。不确定是否有解决方法,但我也一直在寻找。

【讨论】:

以上是关于如何在单独执行“npm install <package>”后运行安装后脚本的主要内容,如果未能解决你的问题,请参考以下文章

使用 Apollo 执行突变后如何更新单独的组件道具

如何在单独执行“npm install <package>”后运行安装后脚本

laravel 队列 - 同步驱动程序如何工作?它是在单独的进程/线程还是主执行线程中执行?

传奇登陆脚本QM如何设置单独触发

在 Robot Framework 中,如何通过为文本文件中的每一行数据创建单独的测试用例来执行数据驱动测试?

Python 配置文件:如何获取每个单独执行的时间(无聚合)