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

Ere*_*evi 187 version package node.js npm

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

IBa*_*Bam 203

我想你可以使用"引擎"字段:

{ "engines" : { "node" : ">=0.12" } }
Run Code Online (Sandbox Code Playgroud)

正如您所说,您的代码肯定不适用于任何较低版本,您可能也需要"engineStrict"标志:

{ "engineStrict" : true }
Run Code Online (Sandbox Code Playgroud)

可以在npmjs站点上找到package.json文件的文档

更新

engineStrict现已弃用,因此这只会发出警告.npm config set engine-strict true如果他们想要这个,现在由用户运行.

  • https://github.com/npm/npm/blob/master/CHANGELOG.md#enginestrict"很少使用的package.json选项`engineStrict`已被弃用**几个月,在使用它时会产生警告从npm @ 3开始,字段的值被忽略,引擎违规只会产生警告.如果你作为用户想要严格的引擎字段强制执行,只需运行npm config set engine-strict true" (9认同)
  • 将`engine-strict = true`添加到.npmrc现在具有相同的效果 (8认同)
  • @ben 完美,谢谢!可以这样做,以便至少您的整个团队都需要遵守引擎版本要求。 (4认同)
  • 为什么他们在地球上不赞成这个。.然后它失去了所有的含义 (2认同)

Mik*_*kel 78

package.json

  "engines": {
    "node": ">=10.0.0",
    "npm": ">=6.0.0"
  },
Run Code Online (Sandbox Code Playgroud)

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

engine-strict=true
Run Code Online (Sandbox Code Playgroud)

  • 这似乎根本没有影响。我使用与上述类似的“引擎”部分(`11.13.0` 和 `6.7.0`)设置了我的 `package.json`,以及一个只包含上面指定内容的 `.npmrc`。我让 nvm 将我切换到较旧的节点版本,然后运行 ​​`npm install`,但它只是安装了依赖项,甚至没有提到引擎版本不匹配。 (5认同)
  • 这是最简单的解决方案,它给最终用户一个很好的错误,即他们在运行 `npm install` 时没有正确版本的节点;也适用于 `yarn` (4认同)
  • 更新:证明在“引擎”部分中的版本格式很重要-简单地将“ 11.13.0”放进去是不正确的,因为它需要整个“> =”位。阅读文档非常有用(https://docs.npmjs.com/files/package.json#engines)。供以后看到的人参考:RTFM。 (3认同)
  • 将 `engine-strict=true` 添加到*您的* .npmrc 文件只会强制*您*在安装软件包时使用正确的引擎。**它不会对您的最终用户强制执行任何操作。** 如果您希望用户在安装时使用 package.json 中“engines: {}”属性下列出的引擎,您应该告诉*他们* 将 `engine-strict=true` 添加到*他们的* .npmrc 文件中。 (3认同)
  • @chharvey,您可以将脚本“preinstall”添加到 `package.json` 中:“echo 'engine-strict=true' >> .npmrc”` (3认同)

Ada*_*dam 45

就像Ibam说的那样,engineStrict现在已被弃用了.但我找到了这个解决方案:

入住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);
}
Run Code Online (Sandbox Code Playgroud)

的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"
  }
}
Run Code Online (Sandbox Code Playgroud)

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

.nvmrc

还有一件事......一个dotfile'.nvmrc'可用于要求特定的节点版本(但我还没试过) - https://github.com/creationix/nvm#nvmrc

  • 这是 2019 年的最佳答案,鉴于 set engine 的弃用以及许多人(可能)由于使用 nvm 切换版本而遇到此问题的现实。 (2认同)
  • 这假设 @babel/node 已安装。 (2认同)

Cir*_*四事件 7

.nvmrc

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

echo v10.15.1 > .nvmrc
Run Code Online (Sandbox Code Playgroud)

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

nvm use
Run Code Online (Sandbox Code Playgroud)

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

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

nvm list
Run Code Online (Sandbox Code Playgroud)

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

使用NVM 0.33.11测试。

  • @AakashVerma 我猜你正在使用 https://github.com/coreybutler/nvm-windows/releases 正如他们的自述文件中提到的“原始的 nvm 是一个完全独立的项目,仅适用于 Mac/Linux。这个项目使用了一个完全独立的项目。不同的哲学,不仅仅是 nvm 的克隆”,所以这并不奇怪。考虑在他们的跟踪器上打开功能请求。 (2认同)
  • 似乎最近有一个 PR 正在等待这个 https://github.com/coreybutler/nvm-windows/pull/594 (2认同)

leo*_*loy 6

这是我的完整的现成脚本,基于Adam 的回答

check-version.js

/* eslint-disable no-console */
const fs = require('fs');
const semver = require('semver');
const childProcess = require('child_process');

// checks that current node and npm versions satisfies requirements in package.json
// to run manually:   node check-version.js [verbose]

const VERBOSE_FORCED = false;    
const args = process.argv.slice(2);
const VERBOSE = VERBOSE_FORCED || (args.length > 0 && args[0] === 'verbose');

const printErrAndExit = (x) => {
  console.error(x);
  console.error('Aborting');
  process.exit(1);
};

const checkNpmVersion = (npmVersionRequired) => {
  if (!npmVersionRequired) {
    console.log('No required npm version specified');
    return;
  }
  const npmVersion = `${childProcess.execSync('npm -v')}`.trim();
  if (VERBOSE) console.log(`npm required: '${npmVersionRequired}' - current: '${npmVersion}'`);
  if (!semver.satisfies(npmVersion, npmVersionRequired)) {
    printErrAndExit(`Required npm version '${npmVersionRequired}' not satisfied. Current: '${npmVersion}'.`);
  }
};

const checkNodeVersion = (nodeVersionRequired) => {
  if (!nodeVersionRequired) {
    console.log('No required node version specified');
    return;
  }
  const nodeVersion = process.version;
  if (VERBOSE) console.log(`node required: '${nodeVersionRequired}' - current: '${nodeVersion}'`);
  if (!semver.satisfies(nodeVersion, nodeVersionRequired)) {
    printErrAndExit(`Required node version '${nodeVersionRequired}' not satisfied. Current: '${nodeVersion}'.`);
  }
};

const json = JSON.parse(fs.readFileSync('./package.json'));
if (!json.engines) printErrAndExit('no engines entry in package json?');
checkNodeVersion(json.engines.node);
checkNpmVersion(json.engines.npm);
Run Code Online (Sandbox Code Playgroud)

它应该放在项目根目录中。

它检查节点和/或 npm 版本,如package.jsonengines条目)中指定的,例如

  "engines": {
    "node": ">=16.0.0 <17.0.0",
    "npm": ">=8.0.0 <9.0.0"
  },
Run Code Online (Sandbox Code Playgroud)

您可以手动调用它

node check-version.js [verbose]

或将其作为脚本包含在内部package json,作为独立脚本或作为其他脚本的先决条件,例如

"scripts" : {
  "start": "node check-version.js && vite",
  "build": "node check-version.js && vite build",
  "lint": "node check-version.js && eslint .",
  "check-version": "node check-version.js verbose"
},
Run Code Online (Sandbox Code Playgroud)


vng*_*lst 5

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

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

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

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

  • -1,因为这是可怕的(真的可怕)的想法。这就像在说,如果您失业,应该先为一家公司注资,然后就可以在那开始工作。 (6认同)
  • 该解决方案有其自身的优点和缺点。节点版本封装可能是其最大的优点。如果您打算以这种方式部署它,缺点是 docker 镜像大小会变得臃肿。 (5认同)
  • 我不同意,这可能会隐藏问题,并且会在未安装节点的情况下侧加载其他版本的节点。 (4认同)
  • 这是一个简单而优雅的解决方案 - 只要从事该产品的团队成员知道这种情况正在发生,我认为这是一个很好的答案。我们在一家大公司使用这种技术来处理十几个 Web 前端产品的各种 Node 版本。在产品之间来回切换时,无需不断切换 nvm。 (4认同)
  • 听起来对我来说是个好主意。单独项目的单独节点版本。可以安全地升级一个而不升级其他。仅catch必须在.bin`./node node-sass`中运行,而不是仅在`node-sass`中运行。不确定所有.bin文件是否相同。 (2认同)