之所以会学习源码,主要是对他能运行这些命令的好奇。这篇源码是尤雨溪自己写的,主要的作用是发布vue。如果是我的话,我会用lerna来做管理,但是尤大是不会用这个的。
const args = require('minimist')(process.argv.slice(2))
const fs = require('fs')
const path = require('path')
const chalk = require('chalk')
const semver = require('semver')
const currentVersion = require('../package.json').version
const { prompt } = require('enquirer')
const execa = require('execa')
1.我们看到的是引入了minimist,这个是一个轻量级的命令行参数解析引擎。process.argv.slice(2)这个是node提供的原生的一个API,argv返回的是一个数组,数组的第一项是你node的安装文件夹,第二项是你的执行的文件的命令。他这句话的意思是截取从第二个开始直到结束你输入的命令。
2.fs是一个node提供读取系统文件的API。
3.path是node提供的解析路径的一个API。
4.chalk 是一个给cmd文字赋上颜色的一个库。
5.semver 用于版本的比较,提供了一系列的API给我们调用,提高开发的效率。
6.currentVersion 从package.json里面读取当前的版本信息。
7.enquirer是交互式询问用户输入,大家可能还记得js原生的API提供了prompt这样一个方法。
8.execa执行你在终端输入的命令的一个库。
上面一共引入了8个内库,有node提供的内置模块,也有外接模块。来共同实现效果。
const preId =
args.preid ||(semver.prerelease(currentVersion) && semver.prerelease(currentVersion)[0])
args.preid的意思是说,当你输入yarn run release --preid=beta 的时候他就能获取到值。说明了args是一个对象。如果你没有这样输入,那么就取currentVersion,在currentVersion外面有一个semver.prerelease方法,这个方法主要是用来返回一个预发布组件的数组。如果存在就取第零项。
const skipTests = args.skipTests
const skipBuild = args.skipBuild
根据命名可以推测出,是跳过测试的。yarn run release --skipTests 他就会跳过对应的测试。
根据命名可以推测出,是跳过打包的。yarn run release --skipBuild 他就会跳过打包的过程。
const packages = fs.readdirSync(path.resolve(__dirname, '../packages')).filter(p => !p.endsWith('.ts') && !p.startsWith('.'))
这个是同步读取了packages文件里面的文件,然后过滤掉不是以ts结尾和不是以.开头的文件。
const skippedPackages = []
这个空的数组指的