手撕vue-cli配置文件——check-versions.js篇
阿新 • • 發佈:2018-01-09
pac 更多 分代 常用 改變 engines shell. 檢測 emp
check-versions.js,vue-cli中檢查版本的js文件。
‘use strict‘ const chalk = require(‘chalk‘) const semver = require(‘semver‘) const packageConfig = require(‘../package.json‘) const shell = require(‘shelljs‘) function exec (cmd) { return require(‘child_process‘).execSync(cmd).toString().trim() } const versionRequirementsconst chalk = require(‘chalk‘):引入的是一個用來在命令行輸出不同顏色文字的模塊,通過chalk.yellow("想添加顏色的文字......")來實現改變文字顏色的; const semver = require(‘semver‘):引入的是一個語義化版本文件的npm包,其實它就是用來控制版本的。“semver”的常用方法如下:= [ { name: ‘node‘, currentVersion: semver.clean(process.version), versionRequirement: packageConfig.engines.node } ] if (shell.which(‘npm‘)) { versionRequirements.push({ name: ‘npm‘, currentVersion: exec(‘npm --version‘), versionRequirement: packageConfig.engines.npm }) } module.exports= function () { const warnings = [] for (let i = 0; i < versionRequirements.length; i++) { const mod = versionRequirements[i] if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { warnings.push(mod.name + ‘: ‘ + chalk.red(mod.currentVersion) + ‘ should be ‘ + chalk.green(mod.versionRequirement) ) } }if (warnings.length) { console.log(‘‘) console.log(chalk.yellow(‘To use this template, you must update following to modules:‘)) console.log() for (let i = 0; i < warnings.length; i++) { const warning = warnings[i] console.log(‘ ‘ + warning) } console.log() process.exit(1) } }
semver.valid(‘1.2.3‘) // ‘1.2.3‘,返回符合版本格式的版本 semver.valid(‘a.b.c‘) // null,如果不符合版本返回null semver.clean(‘ =v1.2.3 ‘) // ‘1.2.3‘,返回一個標準的版本號,且去掉兩邊的空格 semver.satisfies(‘1.2.3‘, ‘1.x || >=2.5.0 || 5.0.0 - 7.2.3‘) // true,第一個參數是測試的版本號,第二個參數是匹配的版本,如果匹配則返回true semver.gt(‘1.2.3‘, ‘9.8.7‘) // false,第一個參數的版本是否比第二個大 semver.lt(‘1.2.3‘, ‘9.8.7‘) // true ,第一個參數的版本您是否比第二個小參考:https://npm.taobao.org/package/semver const packageConfig = require(‘../package.json‘):引入package.json,用來獲取版本。 const shell = require(‘shelljs‘):用來執行unix命令的包。
//這塊兒不太熟,大致意思是用js代碼同步執行一個cmd的命令,並且對返回的結果執行toString()和trim()方法 function exec (cmd) { return require(‘child_process‘).execSync(cmd).toString().trim() }
const versionRequirements = [ { name: ‘node‘, currentVersion: semver.clean(process.version), versionRequirement: packageConfig.engines.node } ]semver.clean(process.version)上面介紹過,返回的是一個版本信息, packageConfig.engines.node是在package.json中了,指的是>=4.0.0
if (shell.which(‘npm‘)) { versionRequirements.push({ name: ‘npm‘, currentVersion: exec(‘npm --version‘), versionRequirement: packageConfig.engines.npm }) }
shelljs的which方法是去系統的路徑(system‘s PATH)中尋找命令,shell.which(‘npm‘)就是尋找npm命令,exec()方法就是上面說的執行一個命令(在這裏是執行npm --version),返回版本信息的函數。關於shelljs更多的東西可以看這裏:
http://www.ruanyifeng.com/blog/2015/05/command-line-with-node.html
https://www.npmjs.com/package/shelljs
module.exports = function () { const warnings = [] for (let i = 0; i < versionRequirements.length; i++) { const mod = versionRequirements[i] if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { warnings.push(mod.name + ‘: ‘ + chalk.red(mod.currentVersion) + ‘ should be ‘ + chalk.green(mod.versionRequirement) ) } } if (warnings.length) { console.log(‘‘) console.log(chalk.yellow(‘To use this template, you must update following to modules:‘)) console.log() for (let i = 0; i < warnings.length; i++) { const warning = warnings[i] console.log(‘ ‘ + warning) } console.log() process.exit(1) } }
這部分代碼就很好理解了,分別檢測當前的npm和node版本是不是符合package.json中定義的,如果不符合就提示wraning。
手撕vue-cli配置文件——check-versions.js篇