如何在package.json中指定所需的Node.js版本?


261

我有一个需要节点版本12或更高版本的Node.js项目。有没有办法在packages.json文件中指定此名称,以便安装程序将自动检查并通知用户是否需要升级?


1
与亚当的回应类似,也使用了node.version:stackoverflow.com/a/48691987/3032209
Yair Kukielka,


已经在这里提出了问题:如何强制使用特定的node.js版本?
cilap '19

我想知道是否有任何工具可以通过检查API使用情况来自动将此字段设置为适当的值。
geekley

Answers:


287

我认为您可以使用“引擎”字段:

{ "engines" : { "node" : ">=0.12" } }

正如您所说的那样,您的代码绝对不能与任何较低版本一起使用,您可能也希望“ engineStrict”标志:

{ "engineStrict" : true }

在npmjs网站上找到package.json文件的文档

更新资料

engineStrict现在已弃用,因此只会发出警告。现在,取决于用户npm config set engine-strict true是否愿意运行它。

更新2

如下所述,在Node的版本不兼容的情况下,.npmrc在项目的根目录下创建一个文件(与package.json文件处于同一级别)engine-strict=true将导致文本错误。


13
github.com/npm/npm/blob/master/CHANGELOG.md#enginestrictengineStrict已经很少使用了很少使用的package.json选项,使用 时会产生警告。从npm @ 3开始,字段会被忽略,并且违反引擎的行为只会产生警告。如果您作为用户希望严格执行引擎字段,只需运行npm config set engine-strict true”
Mike Stead

1
记住要cd .. && npm i <folder-name>检查项目本身。但是,这将触发自身的整个构建。
mlunoe '16

6
为什么在地球上他们不赞成这样做。.然后它失去了所有含义
vasilakisfil

15
engine-strict=true现在添加到您的.npmrc中具有相同的效果
Ben

4
@ben完美,谢谢!可以这样做,以便至少需要整个团队遵守引擎版本要求。
约书亚·品特

114

package.json

  "engines": {
    "node": ">=10.0.0",
    "npm": ">=6.0.0"
  },

到文件.npmrc(靠近package.json,相同目录)

engine-strict=true

3
这是最简单的解决方案,给最终用户一个很大的错误,是他们在运行时没有正确版本的节点npm install; 与工作yarn以及
jcollum

这似乎根本没有效果。我package.json在“引擎”部分设置了与上述(11.13.06.7.0)类似的.npmrc内容,并在上面仅指定了内容。我让nvm将我切换到较旧的节点版本,然后运行npm install,但是它只是安装了依赖项,甚至没有提到引擎版本不匹配。
阿德里安

54

就像伊巴姆所说,engineStrict现在已弃用。但是我找到了这个解决方案:

check-version.js:

import semver from 'semver';
import { engines } from './package';

const version = engines.node;
if (!semver.satisfies(process.version, version)) {
  console.log(`Required node version ${version} not satisfied with current version ${process.version}.`);
  process.exit(1);
}

package.json:

{
  "name": "my package",
  "engines": {
    "node": ">=50.9" // intentionally so big version number
  },
  "scripts": {
    "requirements-check": "babel-node check-version.js",
    "postinstall": "npm run requirements-check"
  }
}

在此处查找更多信息:https : //medium.com/@adambisek/how-to-check-minimum-required-node-js-version-4a78a8855a0f#.3oslqmig4

.nvmrc

还有一件事情。点文件'.nvmrc'可用于要求特定的节点版本-https: //github.com/creationix/nvm#nvmrc

但是,只有npm脚本(和yarn脚本)才尊重它。


2
鉴于引擎已弃用,以及由于使用nvm切换版本而导致许多人(可能)遇到这一现实,这是2019年的最佳答案。
工艺

14

.nvmrc

如果您可能正在使用像这样的NVM,则可以在git跟踪的.nvmrc文件中指示给定项目所需的nodejs版本:

echo v10.15.1 > .nvmrc

这不会自动对生效cd,这是理智的:用户必须然后执行以下操作:

nvm use

现在该节点版本将用于当前shell。

您可以列出拥有的节点的版本:

nvm list

.nvmrc记录在:https : //github.com/creationix/nvm/tree/02997b0753f66c9790c6016ed022ed2072c22603#nvmrc

在以下cd位置询问如何自动选择该节点版本:根据项目自动切换到正确的Node版本

经NVM 0.33.11测试。


8

还有另一种更简单的方法:

  1. npm install Node@8 (将Node 8保存为package.json中的依赖项)
  2. 您的应用程序将使用Node 8为任何人运行-即使是Yarn用户!

之所以有效,node是因为它只是一个将节点作为其二进制程序包交付的程序包。它仅包含为node_module / .bin,这意味着它仅使节点可用于程序包脚本。不是主壳。

在此处查看Twitter上的讨论:https//twitter.com/housecor/status/962347301456015360


5
我不同意,这可能会隐藏问题,并且会在未安装节点的情况下侧加载其他版本的节点。
布伦丹·汉尼曼

7
-1,因为这是可怕的(真的可怕)的想法。这就像在说,如果您失业,则应先为一家公司注资,然后才能在那开始工作。
ozanmuyes

2
听起来对我来说是个好主意。单独项目的单独节点版本。可以安全地升级一个而不升级其他的。只有catch必须在.bin中运行,./node node-sass而不仅仅是node-sass。不确定所有.bin文件是否相同。
乔恩

2
这是一个简单而优雅的解决方案-只要从事该产品工作的团队成员都知道这种情况正在发生,我认为这是一个很好的答案。我们在一家大型公司中使用这种技术来处理十二种Web前端产品的各种Node版本。在产品之间来回切换时,无需使用nvm进行恒定切换。
内森·贝德福德

2
此解决方案有其优点和缺点。节点版本封装可能是其最大的优点。如果您要以这种方式进行部署,不利的一面便是庞大的docker映像大小。
ivosh

0

Mocha测试用例示例:

describe('Check version of node', function () {
    it('Should test version assert', async function () {

            var version = process.version;
            var check = parseFloat(version.substr(1,version.length)) > 12.0;
            console.log("version: "+version);
            console.log("check: " +check);         
            assert.equal(check, true);
    });});

1
不应该是单元测试,请使用package.json / dotfiles
bgcode

2
但是,为什么要为此设计单元测试> .-
Jamie Nicholl-Shelley

因为您需要Node来运行单元测试。如果存在的节点版本过时,则测试将无法运行,否则将因语法错误或错误而失败。类似,这破坏了单元测试的目的。这就像将密码重置表单隐藏在授权表单后面。如果您忘记了密码,则需要使用重置密码功能,但是现在您将无法使用它,因为您忘记了密码。
ankhzet
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.