我从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,这解释了为什么需要进行重大更改。但是,我还不清楚如何更好地处理过渡。
答案 0 :(得分:11)
我使用check-node-version
找到了更好的解决方案;该软件包具有命令行界面,使其易于用于此目的。以下是我建议作为最佳实践的步骤:
npm install -D check-node-version@1
,prepublish
脚本重命名为prepare
,prepublish
脚本以处理向后兼容性,并建议升级npm(请参阅下文。)我的 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
上运行时停止。
以下是使用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
上的行为。