Npm:仅在作为依赖项安装时运行 postinstall 脚本

Kew*_*hka 9 npm babeljs npm-scripts

我开发了一个 npm 包(“node_commons”),它包含在我的其他项目中,如下所示:

package.json(其他项目)

"node-commons": "git+ssh://git@stash.custom.domain.net:7999/npm/libs/node_commons.git"
Run Code Online (Sandbox Code Playgroud)

node_commons 包是用 ES6 编写的,但以后不支持此版本,因此我使用 postinstall 脚本将其与 babel 转译。

package.json (node_commons)

"postinstall": "babel src -d src"
Run Code Online (Sandbox Code Playgroud)

这工作正常。当包作为依赖项包含在我的项目中时,文件将被转换。

我的问题:当我开发 node_commons 包时,我npm install用来安装内部依赖项。但后来我不想转译它。当包作为依赖项安装时(例如在我的其他项目中),我只想转译。有没有办法做到这一点?

像这样的东西:

package.json (node_commons)

"postinstall-as-dependency": "babel src -d src"
Run Code Online (Sandbox Code Playgroud)

ozm*_*ozm 7

  • 在模块根目录中创建.no-postinstall文件。
  • Mac 和 Linux:将以下内容添加到package.json"postinstall": "if [ ! -e .no-postinstall ]; then babel src -d src; fi"
  • Windows:将以下内容添加到package.json"postinstall": if exist .no-postinstall () else (babel src -d src)"
  • 跨平台(更多工作): 您可以创建一个节点脚本(即./my-script.js)并使用fs模块,检查是否存在.no-postinstall并执行babel src -d src使用,child_process.exec()官方文档中所述。将您的脚本添加到package.json"postinstall": node my-script.js

请注意,我使用的是 Mac,因此无法验证 Windows 版本。

解释

if [ ! -e .no-postinstall ]!检查给定文件是否不存在(使用否定运算符)。如果文件不存在,它将执行您的脚本。由于您将.no-postinstall文件添加到模块根目录,因此在安装内部模块时不会执行脚本。另一方面,将模块安装为依赖项的模块.no-postinstall在其根目录中没有文件,并且您的脚本会被执行。

.no-postinstall不是一个特殊的名称,您可以使用您选择的任何名称。

  • 这是没有用的。因为 npm 脚本始终以包根目录作为其 CWD 运行。https://docs.npmjs.com/cli/v6/commands/npm-run-script (2认同)

Der*_*yen 4

如果我理解正确,您希望您的包postinstall仅在用户将其安装为依赖项(npm install node-common)时才运行脚本?

当您的安装后脚本运行时,它具有npm_config_save_dev可用的权限,当用户使用以下标志安装包时,这是“true” --save-dev

"postinstall": "! [ $npm_config_save_dev ] && echo \"Installed as a dependency\" || \"Installed as a dev dependency\""
Run Code Online (Sandbox Code Playgroud)