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

Ale*_*Zak 4 node.js npm npm-install npm-scripts

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

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

提前非常感谢女生/男生!:)

Moh*_*lal 8

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

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

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

现在,如果您制作一个npm install软件包,并且其中一个软件包有一个prepare脚本(例如构建脚本),并且它失败了,那么整个安装都会失败。

我们有两个选择:

忽略脚本

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

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

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

将包添加到optionalDependencies

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

如果可以使用依赖项,但您希望 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。这很可能会满足您的需求。


Ras*_*JFR 7

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

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

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

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

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

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

  • 这可能会导致其他问题。有些软件包需要运行脚本才能使用。这会全局禁用所有脚本(仅针对此运行),并可能导致其他问题。当心! (3认同)

Ric*_*mer 7

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

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

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

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

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

  • 您的“准备”脚本生成您的 CSS
  • 你的代码和生成的 CSS 被发布到 npm repo

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

  • 这是这里唯一真正理解并回答问题的答案 (3认同)

Yas*_*sha 6

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

准备:在打包和发布该软件包之前,以及在没有任何参数的本地npm安装上运行(请参见下文)。它在预发布之后运行,但仅在预发布之前运行。

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

  • “本地 npm install”是当您 `git clone &lt;github.com/thepackage&gt;` 然后执行 `cd thepackage` 并运行 `npm install` 时,而不是使用 `npm install &lt;thepackage 从注册表安装包&gt;` (2认同)