我有一个Node.js项目,需要Node版本12或更高。有没有办法在包中指定这个。Json文件,以便安装程序自动检查并通知用户是否需要升级?
当前回答
一个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);
});});
其他回答
以下是我完整的现成脚本,基于亚当的回答。
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);
它应该放在根项目目录中。
它检查包中指定的节点和/或npm版本。Json(引擎条目),例如
"engines": {
"node": ">=16.0.0 <17.0.0",
"npm": ">=8.0.0 <9.0.0"
},
您可以手动调用它
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"
},
一个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);
});});
.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"
},
所以你应该总是,总是把它设置为你在本地使用的。
这一点之前已经在这个自删除的回复中提到过。
在package.json中添加以下内容:
"engines": {
"npm": ">=8.0.0 <9.0.0",
"node": ">=16.0.0 <17.0.0"
},
将以下内容添加到.npmrc(与package.json相同目录):
engine-strict=true
还有另一种更简单的方法:
npm安装Node@8(将Node 8保存为package.json中的依赖项) 您的应用程序将使用Node 8为任何人运行-甚至Yarn用户!
这是因为node只是一个包,它将node作为它的包二进制文件发布。它只是包含node_module/.bin,这意味着它只使node对包脚本可用。不是主外壳。
查看Twitter上的讨论:https://twitter.com/housecor/status/962347301456015360
推荐文章
- NPM清洁模块
- 在Node.js中加载基本HTML
- Node.js和CPU密集型请求
- 为什么在节点REPL中没有定义__dirname ?
- 在Node.js中克隆对象
- Node.js中的process.env.PORT是什么?
- js的Mongoose.js字符串到ObjectId函数
- ELIFECYCLE Node.js错误是什么意思?
- npm -D标志是什么意思?
- 如何完全卸载Ubuntu中的nodejs, npm和node
- 在猫鼬模式中添加created_at和updated_at字段
- 我如何把变量javascript字符串?
- 如何强制tsc忽略node_modules文件夹?
- NPM全局安装“无法找到模块”
- MongoDB和Mongoose的区别