項目倉庫
指令行工具需要用到的依賴
- node環境
- commander用于定義指令
- inquire用于和使用者進行互動
- chalk讓指令行的字元帶上顔色
- progress指令行進度條
配置一個腳手架工具的流程
- 編寫腳手架工具項目
- 配置pakage.json
- 釋出到npm(本地測試可以使用npm link)
- 運作指令
- 解析指令
- 下載下傳模闆
//注意本地測試需要npm link注冊指令
sudo npm link
Index.js
#!/usr/bin/env node
const cm = require('commander');
const inquirer = require('inquirer');
const chalk = require('chalk');
const down = require('./download')
// console.log('hello world')
// console.log(chalk.blue('hello smileyqp'))
// console.log(chalk.yellow('yellow'))
cm.version('1.0.0','-v --version')
cm.command('init <name>').action((name)=>{
inquirer.prompt([
{
type:"input",
name:'projectname',
message:'項目叫什麼名字'
}
]).then((answer)=>{
console.log(answer)
console.log(name)
down(answer.projectname)
})
})
cm.parse(process.argv)
download.js
const fs = require('fs')
module.exports = function(name){
//node讀取檔案不能整個讀取,它隻能讀取到檔案夾裡面的内容資訊
var demopath = './project'
var targetpath = './'+name;
//資料驅動思維
var arr = []
fs.mkdir(targetpath,function(){
pusharr(demopath)
//forEach循環中有異步,會導緻問題,用閉包解決
arr.forEach((item,index)=>{
(function(item){
console.log(item)
if(item[0] =='file'){
fs.readFile(item[1],(err,data)=>{
fs.writeFile(targetpath+'/'+item[1].replace('./project','.'),data,function(){})
})
}else{
fs.mkdir(targetpath+'/'+item[1].replace('./project','.'),function(){})
}
})(item)
})
})
function pusharr(path){
var files = fs.readdirSync(path)
files.forEach((item,index) => {
var nowpath = path + '/'+item;
var stat = fs.statSync(nowpath)
if(stat.isDirectory()){ //如果是檔案夾
arr.push(['dir',nowpath])
pusharr(nowpath) //是檔案夾繼續調用這個方法,進行遞歸
}else{
arr.push(['file',nowpath])
}
});
}
}
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2csUTVE1kejpWTw0keYhnRzwEMW1mY1RzRapnTtxkb5ckYplTeMZTTINGMShUYfRHelRHLwEzX39GZhh2css2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xyayFWbyVGdhd3LcV2Zh1Wa9M3clN2byBXLzN3btg3Pn5GcukjN2IDOxUTMzEzNwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)