为什么 npm 安装后 npm 运行准备脚本,如何停止它?

问题描述 投票:0回答:4

每当我运行

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

值得一提的是,我已经检查过

package.json
中没有 postinstall 脚本。

node.js npm npm-install npm-scripts
4个回答
38
投票

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

prepare:在打包和发布包之前运行两者,并在 本地 npm install 不带任何参数(见下文)。这是在之后运行的 预发布,但仅在预发布之前。

从 NPM v5 开始,运行

prepare
 时会执行 
npm install

脚本

36
投票

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

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

因此,当您运行

npm install
时,会发生以下情况:

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

当你运行

npm publish
时,会发生类似的事情:

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

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


27
投票

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

准备: 在打包和发布包之前、在不带任何参数的本地 npm install 上以及在安装 git 依赖项时运行(见下文)。这是在预发布之后、仅在预发布之前运行的。

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

您可以使用

--ignore-scripts
标志来避免它:

$ npm install <package> --ignore-scripts

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


7
投票

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

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

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

现在,如果您制作一个

npm install
并且其中一个软件包有一个
prepare
脚本(例如用于构建),并且它失败了,则整个安装都会失败。

我们有两个选择:

忽略脚本

npm install --ignore-scripts

这将对所有包运行忽略,这可能不是所需的行为。想象一下需要运行

prepare
build
的第三方包。如果您使用
--ignore-scripts
运行,这将被跳过。

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

将包添加到

optionalDependencies
:

{
   optionalDependencies: {
       "myPackage": "^1.0.0"
   }
}

如果可以使用依赖项,但您希望 npm 在找不到或安装失败时继续执行,那么您可以将其放入

optionalDependencies
对象中。这是包名称到版本或 url 的映射,就像
dependencies
对象一样。不同之处在于构建失败不会导致安装失败。

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

检查文档:

https://docs.npmjs.com/cli/v7/configuring-npm/package-json#可选依赖项

注意: 这样,仅涉及所选的包。如果失败,安装将继续。这通常就是您想要的。

选择可选的依赖项

根据此线程中的答案:

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

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

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

一般搭配

optionalDependencies
会更好。这很可能会满足您的需求。

© www.soinside.com 2019 - 2024. All rights reserved.