[轉]使用 Node.js 開發簡單的腳手架工具
阿新 • • 發佈:2020-11-02
原連結:https://segmentfault.com/a/1190000015222967
首先來看看會用到哪些庫。
- commander.js,可以自動的解析命令和引數,用於處理使用者輸入的命令。
- download-git-repo,下載並提取 git 倉庫,用於下載專案模板。
- Inquirer.js,通用的命令列使用者介面集合,用於和使用者進行互動。
- handlebars.js,模板引擎,將使用者提交的資訊動態填充到檔案中。
- ora,下載過程久的話,可以用於顯示下載中的動畫效果。
- chalk,可以給終端的字型加上顏色。
- log-symbols,可以在終端上顯示出 √ 或 × 等的圖示。
首先建立一個空專案,暫時命名為 okii-cli,然後新建一個 index.js 檔案,再執行 npm init 生成一個 package.json 檔案。最後安裝上面需要用到的依賴。
npm install commander download-git-repo inquirer handlebars ora chalk log-symbols -S
#!/usr/bin/env node
const fs = require('fs');
const program = require('commander');
const download = require('download-git-repo');
const handlebars = require('handlebars');
const inquirer = require('inquirer');
const ora = require('ora');
const chalk = require('chalk');
const symbols = require('log-symbols');
program.version('1.0.0', '-v, --version')
.command('init <name>')
.action((name) => {
if(!fs.existsSync(name)){
inquirer.prompt([
{
name: 'description',
message: '請輸入專案描述'
},
{
name: 'author',
message: '請輸入作者名稱'
}
]).then((answers) => {
const spinner = ora('正在下載模板...');
spinner.start();
download('http://xxxxxx:9999:HTML5/H5Template#master', name, {clone: true}, (err) => {
if(err){
spinner.fail();
console.log(symbols.error, chalk.red(err));
}else{
spinner.succeed();
const fileName = `${name}/package.json`;
const meta = {
name,
description: answers.description,
author: answers.author
}
if(fs.existsSync(fileName)){
const content = fs.readFileSync(fileName).toString();
const result = handlebars.compile(content)(meta);
fs.writeFileSync(fileName, result);
}
console.log(symbols.success, chalk.green('專案初始化完成'));
}
})
})
}else{
// 錯誤提示專案已存在,避免覆蓋原有專案
console.log(symbols.error, chalk.red('專案已存在'));
}
})
program.parse(process.argv);