npm:禁用包的postinstall脚本

far*_*yer 124 node.js npm

在安装包时是否存在禁用安装后脚本的任何npm选项?或者从package.json重写任何字段?

Ger*_*osi 235

不能仅禁用postinstall脚本.但是,您可以使用以下命令禁用所有脚本

$ npm install --ignore-scripts
Run Code Online (Sandbox Code Playgroud)

正如delbertooo在评论中提到的,这也会禁用依赖项的脚本.

  • 警告!选项`--ignore-scripts`禁用所有脚本 - 甚至是依赖项.如果你的依赖项需要运行脚本来安装一些二进制文件,它们可能会破坏/不完整. (62认同)
  • 那么是否有一种技术可以安装node_modules(及其所有脚本)但只忽略主程序包的脚本? (5认同)
  • 我直接检查了代码:https://github.com/npm/npm/blob/master/lib/build.js#L179 (3认同)
  • 谢谢.这正是我需要的.我在哪里可以找到这样的选择?这在'npm help install','npm help config'和'npm help scripts'中没有描述. (2认同)
  • 它实际上在`npm-config`的文档中:https://github.com/npm/npm/blob/master/doc/misc/npm-config.md#ignore-scripts(也可在此处获取:https:// www.npmjs.org/doc/misc/npm-config.html) (2认同)
  • 不仅如此,`--ignore-scripts`或相关的config选项(我在全局范围内设置)也将意味着“ npm run start”将无声无息并报告成功。惊奇。 (2认同)

Vah*_*hid 14

如果您使用的 NPM >= 8,您还可以postinstall暂时删除该脚本:

npm pkg set scripts.postinstall="echo no-postinstall"
npm install
Run Code Online (Sandbox Code Playgroud)

或者使用 NPM 7,如下所示:

npm set-script postinstall ""
npm install
Run Code Online (Sandbox Code Playgroud)

来源: https://docs.npmjs.com/cli/v7/commands/npm-set-script/


Atu*_*tul 13

我想为我的项目禁用安装后脚本,但希望我的项目依赖项的所有脚本在我执行npm install. 这就是我最终要做的。

  1. 创建脚本 ./scripts/skip.js
if (process.env.SKIP_BUILD) {
    process.exit(0);
} else {
    process.exit(1);
}
Run Code Online (Sandbox Code Playgroud)
  1. 在你的 package.json 文件中
 "scripts": {
  ...
  "postinstall": "node ./scripts/skip.js || npm run build",
  ...
 }
Run Code Online (Sandbox Code Playgroud)

现在只需设置环境变量 SKIP_BUILD=1 以防止您的包构建,您的依赖项将构建得很好

SKIP_BUILD=1 npm install
Run Code Online (Sandbox Code Playgroud)

  • 好的!我可能只是做 "postinstall": "node process.env.RUN_POSTINSTALL && npm run build" (3认同)

Ale*_*lls 11

要为您自己的库执行此操作,我推荐一些简单的方法,例如:

#!/usr/bin/env bash

## this is your postinstall.sh script:

set -e;

if [ "$your_pkg_skip_postinstall" == "yes" ]; then
  echo "skipping your package's postinstall routine.";
  exit 0;
fi
Run Code Online (Sandbox Code Playgroud)

然后使用以下命令进行 npm 安装:

your_pkg_skip_postinstall="yes" npm install
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!如果您只是尝试禁用自己的脚本而不是所有依赖项中的所有脚本,那么这非常有用。 (2认同)

Rob*_*Mex 6

您还可以在npm配置文件中启用设置。

npm config set ignore-scripts true

注意:这将禁用所有NPM软件包的脚本。

  • 请注意,它还禁用了手动执行“npm run …”的能力 - 它什么也不做,没有任何警告。 (12认同)
  • 这应该是答案。请参阅 npm 博客文章:https://blog.npmjs.org/post/141702881055/package-install-scripts-vulnerability (3认同)