如何在单独执行 "npm install <package>" 后 运行 post 安装脚本
How to run a post-install script after individual execution of "npm install <package>"
我正在维护以下目录结构:
/home/user/Desktop/
|-- app/
| |-- package.json
| `-- server.js
|-- node/
| |-- bin/
| | |-- node
| | `-- npm
| |-- include/
| |-- lib/
| `-- share/
|
`-- npm.sh
我希望所有本地安装的节点模块都位于目录 node
中。也就是说,如果我 运行 npm install
在目录 app
中,最初它会在当前目录 (app
) 中安装模块,然后移动 node_modules
文件夹到名为 node
的外部目录。为此,我编写了一个脚本 npm.sh
并将 mv
(移动)命令放入 package.json
.
的 postinstall
脚本中
这些是文件 npm.sh
和 package.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 && cd app && npm install
时,一切都按预期进行。但是当我执行 npm install jwt-simple
时,postinstall
脚本没有被执行。
有没有办法让它适用于个人 npm install <package>
?或者有没有更好的方法来完成这个?
您可以在安装包后使用npm hook scripts做一些事情。
创建 node_modules/.hooks/postinstall
可执行文件,它在 npm install <package>
之后也是 运行。
注意: 我注意到 npm 版本 5.1.0 到 6.0.1 之间的 npm 钩子脚本存在问题。因此,如果您遇到 hooks 问题,请检查您的 npm 版本并在必要时升级。
对于任何在这里绊倒的人来说,npm 在安装特定软件包时不会 运行 pre/postinstall package.json 中的 pre/postinstall 。您可以在这里查看以供参考,https://npm.community/t/preinstall-npm-hook-doesnt-execute-when-installing-a-specific-package/2505。不确定是否有解决方法,但我也一直在寻找。
我还不能写评论,因为我是新用户,但我想详细说明 。
好像Hook Scripts functionality has been removed starting with npm v7.X.
所以,为了使用 node_modules/.hooks/postinstall
钩子,运行ning npm v6.X 将是最好的选择。
此外,正如评论中所指出的,有一个陷阱:Hook Scripts 不会在 Windows 上开箱即用,因为它无法将文件识别为可执行文件,因为它缺少文件扩展名。
一个不太漂亮的解决方法是创建一个postinstall.cmd
和软(或硬/H
)链接它与mklink postinstall postinstall.cmd
这将确保 Windows 将文件识别为 .cmd
可执行文件以正确 运行 它。
我正在维护以下目录结构:
/home/user/Desktop/
|-- app/
| |-- package.json
| `-- server.js
|-- node/
| |-- bin/
| | |-- node
| | `-- npm
| |-- include/
| |-- lib/
| `-- share/
|
`-- npm.sh
我希望所有本地安装的节点模块都位于目录 node
中。也就是说,如果我 运行 npm install
在目录 app
中,最初它会在当前目录 (app
) 中安装模块,然后移动 node_modules
文件夹到名为 node
的外部目录。为此,我编写了一个脚本 npm.sh
并将 mv
(移动)命令放入 package.json
.
postinstall
脚本中
这些是文件 npm.sh
和 package.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 && cd app && npm install
时,一切都按预期进行。但是当我执行 npm install jwt-simple
时,postinstall
脚本没有被执行。
有没有办法让它适用于个人 npm install <package>
?或者有没有更好的方法来完成这个?
您可以在安装包后使用npm hook scripts做一些事情。
创建 node_modules/.hooks/postinstall
可执行文件,它在 npm install <package>
之后也是 运行。
注意: 我注意到 npm 版本 5.1.0 到 6.0.1 之间的 npm 钩子脚本存在问题。因此,如果您遇到 hooks 问题,请检查您的 npm 版本并在必要时升级。
对于任何在这里绊倒的人来说,npm 在安装特定软件包时不会 运行 pre/postinstall package.json 中的 pre/postinstall 。您可以在这里查看以供参考,https://npm.community/t/preinstall-npm-hook-doesnt-execute-when-installing-a-specific-package/2505。不确定是否有解决方法,但我也一直在寻找。
我还不能写评论,因为我是新用户,但我想详细说明
好像Hook Scripts functionality has been removed starting with npm v7.X.
所以,为了使用 node_modules/.hooks/postinstall
钩子,运行ning npm v6.X 将是最好的选择。
此外,正如评论中所指出的,有一个陷阱:Hook Scripts 不会在 Windows 上开箱即用,因为它无法将文件识别为可执行文件,因为它缺少文件扩展名。
一个不太漂亮的解决方法是创建一个postinstall.cmd
和软(或硬/H
)链接它与mklink postinstall postinstall.cmd
这将确保 Windows 将文件识别为 .cmd
可执行文件以正确 运行 它。