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


当前回答

.nvmrc

如果你像这样使用NVM,那么你可以在git-tracked .nvmrc文件中指明给定项目所需的nodejs版本:

node --version > .nvmrc

or:

echo v10.15.1 > .nvmrc

这不会在cd上自动生效,这是正常的:用户必须执行以下操作:

nvm use

现在该版本的node将用于当前shell。

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

nvm list

.nvmrc的文档在:https://github.com/creationix/nvm/tree/02997b0753f66c9790c6016ed022ed2072c22603#nvmrc

如何自动选择在cd上的节点版本被问到:自动切换到基于项目的节点的正确版本

用NVM 0.33.11测试。

.nvmrc vs package。json引擎

你可能想做的是:

使用包装发动机。Json给出一个“没有已知不兼容范围” 给.nvmrc设置一个"测试对象"

很像包装。Json vs package-lock.json。

赫鲁确实尊重包装。json引擎:

值得一提的是,正如这里所记录的,Heroku确实很好地发挥了作用,并遵守了引擎:入口,例如:

  "engines": {
    "node": "14.17.0",
    "npm": "6.14.13"
  },

所以你应该总是,总是把它设置为你在本地使用的。

这一点之前已经在这个自删除的回复中提到过。

其他回答

您可以在包中设置engines字段。为节点或NPM版本或两者设置要求:

  "engines" : { 
    "npm" : ">=8.0.0 <9.0.0",
    "node" : ">=16.0.0 <17.0.0"
  }

为了通过npm强制执行这个命令,你需要创建一个.npmrc文件(并将其提交到存储库中),并将engines-strict选项设置为true,这将导致npm命令(如npm install)在所需的引擎版本不匹配时失败:

# .npmrc
engine-strict=true

如果没有这个文件,每个开发人员都需要在他们的本地工作空间中运行npm config set engine-strict true来开启这个选项。

原来的答案

正如你说的,你的代码肯定不能在任何低版本下工作,你可能也需要"engineStrict"标志:

{ "engineStrict" : true }

包的文档。Json文件可以在NPMJS网站上找到

更新

engineStrict现在已弃用,所以这只会给出一个警告。现在轮到用户执行npm config set engine-strict true,如果他们想要这个。

更新2

正如ben在下面指出的,在你的项目的根目录下创建一个.npmrc文件(与你的包在同一级别)。如果Node版本不兼容,使用text engine-strict=true将在安装过程中强制报错。

就像Ibam所说的,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脚本)尊重。

.nvmrc

如果你像这样使用NVM,那么你可以在git-tracked .nvmrc文件中指明给定项目所需的nodejs版本:

node --version > .nvmrc

or:

echo v10.15.1 > .nvmrc

这不会在cd上自动生效,这是正常的:用户必须执行以下操作:

nvm use

现在该版本的node将用于当前shell。

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

nvm list

.nvmrc的文档在:https://github.com/creationix/nvm/tree/02997b0753f66c9790c6016ed022ed2072c22603#nvmrc

如何自动选择在cd上的节点版本被问到:自动切换到基于项目的节点的正确版本

用NVM 0.33.11测试。

.nvmrc vs package。json引擎

你可能想做的是:

使用包装发动机。Json给出一个“没有已知不兼容范围” 给.nvmrc设置一个"测试对象"

很像包装。Json vs package-lock.json。

赫鲁确实尊重包装。json引擎:

值得一提的是,正如这里所记录的,Heroku确实很好地发挥了作用,并遵守了引擎:入口,例如:

  "engines": {
    "node": "14.17.0",
    "npm": "6.14.13"
  },

所以你应该总是,总是把它设置为你在本地使用的。

这一点之前已经在这个自删除的回复中提到过。

一个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);
    });});

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

npm安装Node@8(将Node 8保存为package.json中的依赖项) 您的应用程序将使用Node 8为任何人运行-甚至Yarn用户!

这是因为node只是一个包,它将node作为它的包二进制文件发布。它只是包含node_module/.bin,这意味着它只使node对包脚本可用。不是主外壳。

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