今天呢忘分,準(zhǔn)備推薦一個(gè)工具
如果你現(xiàn)在沒有開發(fā)命令行工具的打算
那可以先收藏著
以后棋枕,或許,應(yīng)該會(huì)用到吧
丹尼爾: 蛋兄妒峦,手頭有個(gè)任務(wù)要開發(fā)一個(gè)命令行工具重斑,有沒快速搞起來的辦法
蛋先生: 用 ncgen 啊
丹尼爾: 額,這不是開發(fā)代碼生成器的嗎肯骇?我這不還沒有命令行工具的項(xiàng)目模板嘛
蛋先生: 哦哦窥浪,也是祖很,想錯(cuò)了。那看一下《烹飪一道美味的 CLI》 唄漾脂,已經(jīng)把來龍去脈講得很詳細(xì)了
丹尼爾: 是很詳細(xì)假颇,但就是太過詳細(xì)了,我想要嗖的一下就能搞定那種
蛋先生: 嗖的一下符相?容我想想拆融,( ̄o ̄) . z Z
丹尼爾: 蛋兄,蛋兄 ...
蛋先生: 想起來了啊终,《烹飪一道美味的 CLI》 有提到啊镜豹,就是 oclif 了
丹尼爾: 怎么用呢?假設(shè)我現(xiàn)在要開發(fā)一個(gè)百寶箱工具蓝牲,就叫 dx-tools 吧
蛋先生: 沒問題趟脂,首先肯定是要自動(dòng)初始化工程項(xiàng)目的啦,最低要求了
丹尼爾: 哎呦不錯(cuò)例衍,開發(fā)的時(shí)候昨運(yùn)行呢昔期?
蛋先生: 簡(jiǎn)單~
丹尼爾: 那現(xiàn)在來給百寶箱工具增加復(fù)制的功能吧,如 dx-tools cp
蛋先生: 安排佛玄。dx-tools cp
中的 cp
就是 dx-tools 的子命令 (oclif 稱為 command)硼一,oclif 也為 command 提供了代碼生成工具
蛋先生: 運(yùn)行后會(huì)生成 src/commands/cp.ts
代碼文件。代碼長啥樣呢梦抢,我們等會(huì)再看般贼。先運(yùn)行下看看效果,可以看出已經(jīng)有 cp
這個(gè)子命令了
丹尼爾: Good奥吩!光有 cp 還不行哼蛆,還得指定參數(shù),像這樣子 dx-tools cp source_file target_file
蛋先生: 好咧霞赫!dx-tools cp source_file target_file
中的 source_file
和 target_file
是子命令 cp
的參數(shù)(oclif 稱為 command arguments)腮介。加參數(shù)前我們先看下 cp
默認(rèn)生成的幫助信息,等會(huì)才好看出變化
丹尼爾: 細(xì)心哦~
蛋先生: 前面提到生成的代碼文件 src/commands/cp.ts
端衰,這會(huì)我們來看下代碼叠洗。
import {Command, Flags} from '@oclif/core'
export default class Cp extends Command {
static description = 'describe the command here'
static examples = [
'<%= config.bin %> <%= command.id %>',
]
static flags = {
// flag with a value (-n, --name=VALUE)
name: Flags.string({char: 'n', description: 'name to print'}),
// flag with no value (-f, --force)
force: Flags.boolean({char: 'f'}),
}
static args = [{name: 'file'}]
public async run(): Promise<void> {
const {args, flags} = await this.parse(Cp)
const name = flags.name ?? 'world'
this.log(`hello ${name} from /Users/daniel/Projects/Test/dx-tools/src/commands/cp.ts`)
if (args.file && flags.force) {
this.log(`you input --force and --file: ${args.file}`)
}
}
}
蛋先生: 我們現(xiàn)在需要增加兩個(gè)參數(shù),小修改下
蛋先生: 執(zhí)行看下幫助信息旅东,看惕味,出來了
蛋先生: 再執(zhí)行下,看看獲取參數(shù)的效果
丹尼爾: Nice玉锌!最后我想加個(gè)選項(xiàng)名挥,來指定如果目標(biāo)文件存在,是否進(jìn)行覆蓋主守。像這樣子 dx-tools cp -n source_file target_file
就表示不覆蓋
蛋先生: -n
就是可選項(xiàng)禀倔,一般在命令行中稱為 option榄融,但在 oclif 這里是叫作 flag。再小修改下代碼
蛋先生: 看下幫助信息救湖,搞定
丹尼爾: o(^@^)o 功能都差不多了愧杯,現(xiàn)在得完善幫助信息,來提高用戶使用體驗(yàn)鞋既。
蛋先生: 嗖.嗖.嗖.
蛋先生: Done!
丹尼爾: 這下完美了
蛋先生: 不力九,還差那么一點(diǎn)點(diǎn)
丹尼爾: 啥?
蛋先生: 發(fā)布啊邑闺,你不發(fā)布跌前,別人怎么用呢
丹尼爾: Oh yeah!
蛋先生: 當(dāng)然,oclif 的功能遠(yuǎn)不止這些陡舅,有興趣可以自行去探索了抵乓,今天就到這了
丹尼爾: 恩恩,又到了說再見的時(shí)候了靶衍,88
蛋先生: 要不灾炭,點(diǎn)個(gè)贊鼓勵(lì)一下再走 (^▽^ )