每当我运行
npm install <package>
时,它都会正确安装软件包,但随后它会自动运行 prepare
脚本。
值得一提的是,我已经检查过
package.json中没有
postinstall
脚本。
来自 https://docs.npmjs.com/misc/scripts:
prepare:在打包和发布包之前运行两者,并在 本地 npm install 不带任何参数(见下文)。这是在之后运行的 预发布,但仅在预发布之前。
从 NPM v5 开始,运行
prepare
时会执行
npm install
脚本
其他答案都很好,但对于一些额外的上下文,这是为了支持一个工作流程,您可以使用 devDependency 为您的项目构建资产或其他生成的内容。
例如,假设您想使用node-sass(CSS 预处理器)。您将“node-sass”添加为 devDependency,然后在“prepare”脚本中运行 sass 命令,这会生成 CSS。
因此,当您运行
npm install
时,会发生以下情况:
当你运行
npm publish
时,会发生类似的事情:
所以现在当有人来安装你的包时,他们不需要node-sass或任何你的devDependency。他们只需要运行时依赖。
prepare
脚本在本地安装和安装 git 依赖项时运行:
准备: 在打包和发布包之前、在不带任何参数的本地 npm install 上以及在安装 git 依赖项时运行(见下文)。这是在预发布之后、仅在预发布之前运行的。
您可以使用
--ignore-scripts
标志来避免它:
$ npm install <package> --ignore-scripts
来自文档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 在找不到或安装失败时继续执行,那么您可以将其放入
对象中。这是包名称到版本或 url 的映射,就像optionalDependencies
对象一样。不同之处在于构建失败不会导致安装失败。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
会更好。这很可能会满足您的需求。