banner
NEWS LETTER

脚手架的开发(二)

Scroll down

框架搭建脚手架

为什么需要脚手架框架

  • 提升脚手架开发效率,大幅提升脚手架命令创建、修改的速度
  • 简化脚手架开发过程,大幅提升代码的可读性和可维护性

常用的脚手架框架

使用 yargs 搭建脚手架

还在之前的项目 cli-test 目录,进入目录,安装 yargs

npm i yargs -S

命令无需拼接换行输入,并可以取消缩进的一个插件包 dedent

npm i -S dedent

yargs 的具体的使用。

const yargs = require('yargs/yargs')

const { hideBin } = require('yargs/helpers')

const dedent = require('dedent')

const arg = hideBin(process.argv) // 拿到命令信息
const cli = yargs(arg)

cli
.usage('Usage: cli-test [command] <options>') // 使用说明标题
.demandCommand(1, '最少输入一个命令') // 命令输入限制提示
.strict() // 严格模式,不存在的命令会提示
.recommendCommands() // 命令输入错误后,找到类似的命令,进行提示
.alias('h', 'help') // 别名
.alias('v', 'version')
.epilogue(dedent(`底部的一行描述信息`)) // 底部信息,可以使用 dedent 插件
.options({
// 增加命令配置
debug: {
type: 'boolean',
describe: '启动 debug',
alias: 'd',
},
})
.option('regsitry', {
// 另一种增加命令配置的方式
type: 'string',
describe: '全局的地址',
alias: 'r',
})
.group(['debug'], '开发选项')
.command(
// 也可以通过这种方式追加命令
'init [name]',
'项目初始化',
(yargs) => {
yargs.option('name', {
type: 'string',
describe: '项目名称',
alias: 'n',
})
},
(argv) => {
console.log('argv ==>', argv)
}
)
.command({
// 甚至可以通过这种方式追加
command: 'list',
aliases: ['ls', 'la', 'll'],
describe: 'list 命令的描述信息',
builder: (yargs) => {},
handler: (argv) => {
console.log('fn argv =>', argv)
},
}).argv // 分组命令

使用 Commander 开发脚手架

还在之前的项目 cli-test 目录,进入目录,安装 commander

npm i commander -S

commander 的具体的使用。

const { Command } = require('commander')
const pkg = require('../package.json')

// 获取 commander 的单例
// const { } = commander

// 手动实例化一个 commander 示栗
const program = new Command()

program
.name(pkg.name)
.usage('Hi bro help me cli-test study')
.version(pkg.version)
.option('-d, --debug', '是否开启调试模式', false)
.option('-e, --env <envName>', '获取环境变量名称')

// program
// .command('split')
// .description('Look, use split as a command character')
// .argument('<string>', 'string to split')
// .option('--first', 'display just the first substring')
// .option('-s, --separator <char>', 'separator character', ',')
// .action((str, options) => {
// const limit = options.first ? 1 : undefined
// console.log('===>', str.split(options.separator, limit))
// })

// 注册命令
const clone = program.command('clone <source> [destination]') // 参数约定和要求

clone
.description('Look, is clone')
.option('-f, --first', '是否强制克隆')
.option('-s, --separator <char>', 'separator character', ',')
.action((source, destination) => console.log('do clone', source, destination))

// 注意 这个命令不要链式去写
program.parse(process.argv)

我很可爱,请给我钱

其他文章