npm init生成paackage.json文件 而後在項目根目錄執行操做: mkdir bin && touch bin/jsm.js 在jsm.js文件中添加javascript
#!/usr/bin/env node
console.log('Hello CLI')
複製代碼
#!/usr/bin/env node,告訴操做系統執行這個腳本的時候,調用/usr/bin下的node解釋器前端
package.json文件只有加上了bin字段,才能在控制檯使用你的命令,對應的這裏的命令就是jsm,對應的執行文件爲bin/jsm.js。 其實"jsm"命令就是 "node bin/jsm.js" 的別稱,只有你用npm i -g tools全局安裝後才能夠用,開發的過程當中直接用node bin/jsm.js便可vue
依賴 commanderjava
commander是一個輕巧的nodejs模塊,提供了用戶命令行輸入和參數解析強大功能node
關於commander的說明參考連接apireact
const program = require('commander');
program
.command('create <type> [name] [otherParams...]')
.alias('c')
.description('Generates new code')
.action(function (type, name, otherParams) {
console.log('type', type);
console.log('name', name);
console.log('other', otherParams);
// 在這裏執行具體的操做
});
program.parse(process.argv);
複製代碼
說明linux
command第一個參數爲命令名稱,alias爲命令的別稱, 其中<>包裹的爲必選參數 []爲選填參數 帶有...的參數爲剩餘參數的集合webpack
而後執行命令node bin/jsm.js c component myComponent state=1 title=HelloCLI 輸出的應該是下面的內容git
ora: 實現node.js 命令行環境的 loading效果, 和顯示各類狀態的圖標github
想全部人都能下載。能夠用http下載的方式,若是直接使用SSH地址, 會提示: 'git clone' failed with status 128
download('direct:https://github.com/xxx/react-template.git', name, {clone: true}, (err) => {})
複製代碼
文件的操做,複製,粘貼,增長,刪除,文件內容的新增,替換;能夠藉助fs-extra實現
fs-extra是加強版的fs模塊,模擬了相似如linux的命令
root$ rm -rf /
root$ mv tmpDir tmpNewDir
root$ mkdir -p one/two
root$ cp -r tmp tmpNew
複製代碼
npm init生成paackage.json文件
mkdir bin && touch bin/init.js
在init.js添加 #!/usr/bin/env node
const program = require('commander');
program
.command('create <type> [name] [otherParams]')
.alias('cli')
.description('Generates new code')
.action(function (type, name, otherParams) {
console.log('type', type, name, otherParams);
// 在這裏執行具體的操做
switch(type) {
case 'download':
// 從倉庫下載模版文件
const downloadFunc = require('./download.js');
downloadFunc(name);
break;
case 'create':
// 命令行建立模板文件
const createFunc = require('./create.js');
createFunc(name, otherParams);
break;
default: return false;
}
});
program.parse(process.argv);
複製代碼
touch bin/create.js bin/download.js
download.js實現從git倉庫下載模板腳手架到本地
const downloadFunc = (name) => {
if(!fs.existsSync(name)){
inquirer.prompt([
{
name: 'description',
message: '請輸入項目描述'
},
{
name: 'author',
message: '請輸入做者名稱'
}
]).then((answers) => {
const spinner = ora('正在下載模板...');
spinner.start();
// name是第二個參數,下載路徑
download('direct:http://gitlab.alibaba-inc.com/xxxx#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)){
// 對源文件的package.json進行處理
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('項目已存在'));
}
}
複製代碼
create.js實現建立模板文件, 具體代碼,參見下面連接;
npm i xxxTools -g;
xxxTools create myAPP;
複製代碼