2017-05-18 95 views
16

我跑npm installmy sample project's根文件夹中package.json使用脚本来构建它。最佳实践@> = 4

构建需要在prepublish脚本几个transpilation目前的步骤,但NPM版本4只显示一个警告,即重大更改快到了,导致我相信prepare生成事件的脚本是更长远的证明。

C:\code\antlr4ts-json>npm install 
npm WARN prepublish-on-install As of [email protected], `prepublish` scripts will run only for `npm publish`. 
npm WARN prepublish-on-install (In [email protected] 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休息向后兼容移动脚本:如果有人使用[email protected]运行npm install,在prepare构建步骤会被忽略。

升级我的构建时脚本的最佳做法是什么?理想情况下,我想更新我的package.json使得npm install作品任何NPM @> = 3,但是可替换地产生指示一个明确的错误信息NPM @> = 4在需要时npm install使用运行在npm @ 3将是完全可以接受的。

Bakground:我试过包括

"engines": { "npm": ">=4.0.0" }, 

感谢@toomuchdesign(及其他),我明白了为什么这并不做我想做的; engines只在我的包安装时检查作为依赖关系,而不是某人从源建立它。这就说得通了。

我跟踪了此计划更改的背景,降至npm issue #10074,这解释了为什么需要重大更改。不过,我仍然不清楚如何更好地处理过渡。

+0

我已经更新了这个问题,这样可以很清楚我在寻找最好的做法在这里。我还更新了它,指向一个更简单的示例项目https://github.com/BurtHarris/antlr4ts-json –

+0

更正了示例项目URL:https://github.com/BurtHarris/antlr4ts-json –

+0

注意:I现在已经将我的解决方案投入到示例项目中。 –

回答

8

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

  1. 添加与npm install -D [email protected]发展的依赖,
  2. 重命名现有prepublish脚本prepare
  3. 添加替换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脚本,即使安装[email protected]。如果[email protected]安装这应该大概是正常工作(未经测试)。

  • [email protected]甚至还有关于升级NPM一个有用的信息,但因为脚本使用|| npm run prepare模拟更高版本的问题,将脚本错误后继续。

  • 如果我后来想要对[email protected]采取严格的依赖关系,则删除|| npm run prepare部件会导致脚本在[email protected]上运行时停止。

下面是构建看起来像使用[email protected]

C:\code\antlr4ts-json>npm i 

> [email protected] 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 [email protected]>=4` 

> [email protected] prepare C:\code\antlr4ts-json 
> npm run antlr4 && tsc 
+0

也许更好的我发现['check-node-version'](https://github.com/parshap/check-node-version#readme)已经包含了一个可以检查npm版本的CLI ... –

+0

但是,该版本检查和“准备”脚本不会压制警告。如果能摆脱它们也是件好事。 –

+0

是的。但是,这将在npm上发生变化。 –

0

NPM docs状态engines领域投下只有当你的包被安装为一个依赖的错误:

,除非用户设置engine-strict配置标志,[引擎]字段是咨询只会当产生警告你软件包作为依赖项安装。

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

由于只有在运行npm install时需要编译文件,因此可以简单地使用postinstall钩子。

另请注意,prepublish是留下来的,它只会改变其在[email protected]上的行为,仅在publish挂钩之前触发。

+0

好的,这就解释了为什么使用'engines'字段不起作用,但是当有人在我的项目文件夹中运行'npm install'时,我仍然在寻找一种最佳实践来要求* npm> v4 *。 –

+0

谢谢。我编辑了问题描述,以澄清我正在寻找解决方案,而不仅仅是解释。 –

+0

我明白你的意思了!我更新了我的答案。 –