16

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

/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.shmv移动)命令放在.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 && cd app && npm install,一切都按预期进行。但是当我这样做时npm install jwt-simplepostinstall脚本没有被执行。

有没有办法让它为个人工作npm install <package>?或者有没有更好的方法来做到这一点?

4

3 回答 3

8

你可以在安装包后使用npm 钩子脚本来做一些事情。

创建node_modules/.hooks/postinstall可执行文件,它也将在npm install <package>.

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

于 2018-07-03T13:15:50.943 回答
2

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

于 2019-08-15T15:09:08.040 回答
0

我还不能写评论,因为我是新用户,但我想详细说明Niko 的回答

从npm v7.X开始,似乎Hook Scripts功能已被删除

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

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

一个不太好的解决方法是创建例如 apostinstall.cmd和 soft (或 hard /H)将它与mklink postinstall postinstall.cmd

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

于 2021-12-19T20:39:28.750 回答