为啥在 npm install 之后 npm 正在运行准备脚本,我该如何停止它?

Posted

技术标签:

【中文标题】为啥在 npm install 之后 npm 正在运行准备脚本,我该如何停止它?【英文标题】:Why is npm running prepare script after npm install, and how can I stop it?为什么在 npm install 之后 npm 正在运行准备脚本,我该如何停止它? 【发布时间】:2017-11-13 22:59:19 【问题描述】:

每当我运行npm install <package> 时,它都会正确安装包,但随后它会自动运行prepare 脚本。

值得一提的是,我已经检查过 package.json 中没有 postinstall 脚本。

【问题讨论】:

介意在 package.json 中显示一些信息并在运行命令时显示终端吗?很难说我们什么时候没有事情可做。 npm: disable postinstall script for package的可能重复 【参考方案1】:

来自https://docs.npmjs.com/misc/scripts:

prepare:在打包和发布包之前运行,然后运行 local npm install 不带任何参数(见下文)。这是在之后运行 预发布,但在 prepublishOnly 之前。

从 NPM v5 开始,prepare 脚本会在你运行 npm install 时执行

【讨论】:

【参考方案2】:

prepare 脚本在本地安装和安装 git 依赖项时运行:

prepare: 在打包和发布包之前运行,在本地 npm install 上不带任何参数,以及在安装 git 依赖项时运行(见下文)。这是在 prepublish 之后运行,但在 prepublishOnly 之前运行。

https://docs.npmjs.com/misc/scripts

您可以使用--ignore-scripts 标志来避免它:

$ npm install <package> --ignore-scripts

来源:https://docs.npmjs.com/cli/install

【讨论】:

【参考方案3】:

其他答案很好,但对于一些额外的上下文,这是为了支持一个工作流,您可以使用 devDependencies 为您的项目构建资产或其他生成的内容。

例如,假设您想使用 node-sass(CSS 预处理器)。添加“node-sass”作为 devDependency,然后在“prepare”脚本中运行 sass 命令,生成 CSS。

因此,当您运行 npm install 时,会发生以下情况:

安装依赖和 devDependencies 您的“准备”脚本会生成您的 CSS 您的项目已准备好使用所有必要的 CSS

当你运行 npm publish 时,会发生类似的事情:

您的“准备”脚本会生成您的 CSS 您的代码和生成的 CSS 将发布到 npm 存储库

所以现在当有人来安装你的包时,他们不需要 node-sass 或任何你的 devDependencies。他们只需要运行 deps。

【讨论】:

这是这里唯一真正理解并回答问题的答案【参考方案4】:

来自文档https://docs.npmjs.com/misc/scripts

prepare:在打包和发布包之前运行,在本地 npm install 上运行,不带任何参数(见下文)。这是在 prepublish 之后运行,但在 prepublishOnly 之前运行。

prepare 脚本在发布之前和npm install 之后运行。

现在,如果您创建了一个 npm install 并且其中一个软件包有一个 prepare 脚​​本,例如用于构建,并且它失败了,整个安装将失败。

我们有两种选择:

忽略脚本

npm install --ignore-scripts

这将对所有包运行忽略,这可能不是所需的行为。想象一下需要运行preparebuild 的第三方包。如果你使用--ignore-scripts 运行,这将被跳过。

使脚本可选(更好的选择)

添加一个包到optionalDependencies:


   optionalDependencies: 
       "myPackage": "^1.0.0"
   

如果可以使用依赖项,但如果找不到或安装失败,您希望 npm 继续,那么您可以将其放在 optionalDependencies 对象中。这是包名称到版本或 url 的映射,就像 dependencies 对象一样。不同之处在于构建失败不会导致安装失败。

optionalDependencies 中的条目将覆盖 dependencies 中的同名条目,因此通常最好只放在一个位置。

查看文档:

https://docs.npmjs.com/cli/v7/configuring-npm/package-json#optionaldependencies

注意:有了这个,只关心选择的包。如果失败,安装将继续。这通常是你想要的。

使用 optionalDependencies

根据这个帖子中的这个答案:

https://github.com/npm/npm/issues/2817#issuecomment-368661749

--ignore-scripts 的问题是忽略所有脚本。我只需要能够忽略特定包的脚本(构建无法在某些平台上编译的脚本)。这个选项通常会破坏我的代码,因为它忽略了其他包中实际需要运行的所有脚本。

无论如何,为了使这项工作像 OP 一样工作,我将有问题的软件包设为可选。然后进行常规安装,然后使用 --ignore-scripts 进行第二次安装。这样,我首先运行其他包的脚本,然后第二次忽略它们(包括预期的),然后“获取”该包的源。

通常最好使用optionalDependencies。这很可能满足您的需求。

【讨论】:

以上是关于为啥在 npm install 之后 npm 正在运行准备脚本,我该如何停止它?的主要内容,如果未能解决你的问题,请参考以下文章

“npm update”正在安装模块的 beta 版本,而不是在“npm install”之后安装的稳定版本

为啥“npm install”告诉我“没有安装你必须自己安装对等依赖项:”?

为啥 npm install react-native 不起作用?

Centos:$ npm install -g vue-cli module.js:549 为啥任何的npm install均报此错,在window上的是正常

package-lock.json 在 npm install 之后被重写

为啥 npm install 在 git bash 上不起作用