我从my sample project's根文件夹运行npm install
,使用package.json
中的脚本构建它。
构建需要几个当前在prepublish
脚本中的转换步骤,但是npm version4显示了一个即将发生重大变化的警告,这让我相信新的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@3
__运行npm install
,那么prepare
中的构建步骤就会被忽略。
升级我的构建时脚本的最佳实践是什么?理想情况下,我希望更新我的package.json
,以便npm install
可以在任何npm@>=3上工作,但也可以选择生成一个明确的错误消息,指出在使用npm@3运行npm install
时需要npm@>=4。
Bakground:我试着包括
"engines": { "npm": ">=4.0.0" },
多亏了@toomuchdesign (和其他人),我理解了为什么它不能做我想要的事情;engines
只检查我的包是作为依赖项安装的,而不是有人从源代码构建它。这事儿可以理解。
我跟踪了这个计划中的更改的背景,直到npm issue #10074,这解释了为什么需要一个突破性的更改。然而,我仍然不清楚如何更好地处理过渡。
发布于 2017-05-23 21:53:36
我找到了一个使用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@3
.上运行,删除|| 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
发布于 2017-05-22 16:57:06
NPM docs指出,只有当您的软件包作为依赖项安装时,engines
字段才会转换错误:
除非用户设置了engine-strict
配置标志,否则引擎字段仅在您的软件包作为依赖项安装时才会产生警告。
作为项目的开发人员/管理员,您应该不会看到来自engines
字段的任何警告。
由于只在运行npm install
时需要编译文件,因此可以简单地使用postinstall
钩子。
还请注意,prepublish
会一直存在,它只会在publish
钩子之前触发,从而改变它在npm@5
上的行为。
https://stackoverflow.com/questions/44037774
复制相似问题