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

时间:2017-06-12 12:48:25

标签: node.js npm npm-install npm-scripts

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

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

提前谢谢你们女孩/伙计们! :)

5 个答案:

答案 0 :(得分:5)

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

  

准备:在打包和发布包之前运行它们   没有任何参数的本地npm安装(见下文)。这是在AFTER之后运行的   预发布,但在preublishOnly之前。

自NPM v5起,运行prepare

时会执行npm install脚本

答案 1 :(得分:2)

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

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

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

您可以使用--ignore-scripts标志来避免这种情况:

$ npm install <package> --ignore-scripts

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

答案 2 :(得分:2)

其他答案很好,但是对于某些其他情况,这是为了支持工作流,您可以在其中使用devDependencies为项目构建资产或其他生成的内容。

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

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

  • 依赖和devDependencies已安装
  • 您的“准备”脚本会生成CSS
  • 您的项目已准备就绪,可以使用所有必需的CSS

当您运行npm publish时,会发生类似的情况:

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

因此,现在当有人来安装您的软件包时,他们不需要node-sass或任何您的devDependencies。他们只需要运行时deps。

答案 3 :(得分:0)

除了Yasha的答案外,还很小。当您运行npm installnpm ci

答案 4 :(得分:0)

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

<块引用>

准备:在打包和发布包之前运行,以及在没有任何参数的本地 npm install 上运行(见下文)。这是在预发布之后运行,但仅在预发布之前运行。

prepare 脚本在发布之前和 npm 安装之后运行!

现在,如果您制作 npm install!然后其中一个包有一个 prepare 脚本!喜欢建筑!那失败了! 整个安装失败!它没有通过!不会发生任何变化!

我们有两个选择:

Ingore 脚本

npm install --ignore-scripts

这将忽略所有包!这可能不是所需的行为!想象一个需要运行准备和构建的第三方包!没有问题!但是然后执行上面的!会跳过它!

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

将包添加到 optionalDependencies

{
   optionalDependencies: {
       "myPackage": "^1.0.0"
   }
}
<块引用>

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

<块引用>

optionalDependencies 中的条目将覆盖依赖项中同名的条目,因此通常最好只放在一个地方。

检查文档:

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!最适合您的需求!