为npm @> = 4升级npm`prepublish`脚本的最佳实践是什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (101)

npm install我的示例项目的根文件夹运行,以使用其中的脚本构建它package.json

prepublish脚本目前需要一些编译步骤,但npm版本4显示一个警告,即将发生重大变化,这让我相信新的 prepare构建事件脚本更具前瞻性。

C:\code\antlr4ts-json>npm install
npm WARN prepublish-on-install As of npm@5, `prepublish` scripts will run only for `npm publish`.
npm WARN prepublish-on-install (In npm@4 and previous versions, it also runs for `npm install`.)
npm WARN prepublish-on-install See the deprecation note in `npm help scripts` for more information.
...

不幸的是,简单地移动脚本prepublishprepare打破向后兼容性:如果有人在npm install使用npm@3,则构建步骤prepare将被忽略。

升级我的构建时脚本的最佳做法是什么?理想情况下,我希望更新我的版本package.json,使其npm install适用于任何npm @> = 3,但在使用npm @ 3运行时需要npm @> = 4的清晰错误消息将是完全可以接受的。 npm install

Bakground: 我试过

"engines": { "npm":  ">=4.0.0" },
提问于
用户回答回答于

我找到了一个更好的解决方案check-node-version,该包有一个命令行接口,使其易于用于此目的。下面是我建议的最佳实践步骤:

  1. 将开发依赖项添加到npm install -D check-node-version@1
  2. 重命名现有的prepublish脚本到prepare
  3. 添加替换prepublish处理向后兼容性的脚本,并建议升级NPM(见下文)。

我的n.package.json现在看起来是这样的:

"scripts": {
    "prepare": "npm run antlr4 && tsc",
    "prepublish": "check-node-version --npm \">=4\" || npm run prepare",
    "antlr4": "rimraf gen && antlr4ts Json.g4 -o gen -visitor",
    ...
},
"devDependencies": {
    "check-node-version": "^1.1.2",
    ...

采用这种方法:

  • npm install始终运行prepare脚本,即使npm@3安装好了。如果npm@5已安装(未经测试)。
  • npm@3关于NPM的升级,但因为脚本使用|| npm run prepare,若要模拟较晚版本的行为,脚本将在错误发生后继续运行。
  • 如果我以后想要依赖于npm@4删除|| npm run prepare部件将导致脚本在运行时停止。

下面是构建使用npm@3:

C:\code\antlr4ts-json>npm i

> antlr4ts-json@1.0.6-alpha prepublish C:\code\antlr4ts-json
> check-node-version --npm ">=4" || npm run prepare

node: v6.9.1
npm: v3.10.10
Error: Wanted npm version ">=4" (>=4.0.0)
To install npm, run `npm install -g npm@>=4`

> antlr4ts-json@1.0.6-alpha prepare C:\code\antlr4ts-json
> npm run antlr4 && tsc
用户回答回答于

NPM文档声明,engines只有当你的软件包作为依赖项安装时,该字段才会投出错误:

除非用户设置了engine-strict配置标志,否则[engines]字段仅作为建议,只会在您的软件包作为依赖项安装时产生警告。

作为该项目的开发人员/ mantainer,不应该看到来自你的engines领域的任何警报。

由于你只需要运行时就需要编译文件npm install,因此你可以简单地使用postinstallhook。

扫码关注云+社区

领取腾讯云代金券