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

时间:2017-05-18 02:47:55

标签: npm npm-install

我从my sample project's根文件夹运行 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.
...

不幸的是,只需将脚本从prepublish移动到prepare就会破坏向后兼容性:如果有人使用npm install运行npm@3,则{{1}中的构建步骤默默地忽略。

升级构建时脚本的最佳做法是什么?理想情况下,我想更新prepare以便package.json正常工作对于任何 npm @> = 3 ,但是在运行npm install时生成明确的错误消息,表明 npm @> = 4 npm @ 3 是完全可以接受的。

Bakground:我试过包括

npm install

感谢@toomuchdesign(和其他人),我理解为什么这不能做我想做的事情; "engines": { "npm": ">=4.0.0" }, 仅检查我的软件包安装时作为依赖项,而不是某人从源构建它。这是有道理的。

我将此计划更改的背景跟踪到npm issue #10074,这解释了为什么需要进行重大更改。但是,我还不清楚如何更好地处理过渡。

2 个答案:

答案 0 :(得分:11)

我使用check-node-version找到了更好的解决方案;该软件包具有命令行界面,使其易于用于此目的。以下是我建议作为最佳实践的步骤:

  1. 使用npm install -D check-node-version@1
  2. 添加开发依赖项
  3. 将现有的prepublish脚本重命名为prepare
  4. 添加替换prepublish脚本以处理向后兼容性,并建议升级npm(请参阅下文。)
  5. 我的 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上运行时停止。

      < / LI>

    以下是使用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
    

答案 1 :(得分:0)

NPM docs声明engines字段仅在您的包作为依赖项安装时才会出错:

  

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

作为项目的开发人员/管理员,您不应该看到来自engines字段的任何提醒。

由于您只需在运行npm install时编译文件,因此您可能只需使用postinstall挂钩。

请注意prepublish是留下来的,只会在npm@5挂钩之前触发,才会改变publish上的行为。