在工做中,須要開發一個腳手架,用於給相關用戶提供相關的開發便利性。javascript
對前端、Node 操做有必定的瞭解,同時想了解腳手架開發過程或者須要本身實現一個腳手架的開發者。css
腳手架的開發最開始過程與普通的前端項目相同,須要一個入口文件 command.js
和配置文件 package.json
。前端
與其餘配置文件不一樣的是,你須要在 command.js
文件第一行增長以下聲明:java
#! /usr/bin/env node
複製代碼
同時須要在 package.json
文件中加上一下一項:node
{
...,
"bin": {
"cm-cli": "command.js"
}
}
複製代碼
在配置文件中增長了此項後,只須要在配置文件根目錄下執行 npm link
命令,便可使用 cm-cli --help
命令來查看加載的 cm-cli 腳手架(須要保證 command.js 可以處理響應,詳情見下一節,放在此處是爲了文章方便閱讀)。npm
若是你發佈了你的腳手架,那麼在其餘用戶使用命令 npm install -g cm-cli
以後,即可以在全局下使用你的腳手架了。json
在對註釋和命令進行提示中,咱們須要使用到 commander
包,使用 npm install commander
便可進行安裝。(若是NPM版本低於5,則須要添加 --save
參數保證更新 package.json
配置文件)。bash
commander
是一個提供用戶命令行輸入和參數解析的強大功能。有須要的能夠閱讀相關的庫文檔。在這裏我介紹兩個用的最多的方法。curl
可以初始化自定義的參數對象,設置關鍵字和描述,同時還能夠設置讀取用戶輸入的參數。具體用法以下:函數
const commander = require('commander');
commander.version('1.0.0')
.option('-a, --aaa', 'aaaaa')
.option('-b, --bbb', 'bbbbb')
.option('-c, --ccc [name]', 'ccccc')
.parse(process.argv);
if (commander.aaa) {
console.log('aaa');
}
if (commander.bbb) {
console.log('bbb');
}
if (commander.ccc) {
console.log('ccc', commander.ccc);
}
複製代碼
此時若是已經配置完成而且執行過 npm link
命令後,能夠看到以下結果:
該方法可以在命令行增長一個命令。用戶在執行此命令後,可以執行回調中的邏輯。具體用法以下:
commander
.command('init <extensionId>')
.description('init extension project')
.action((extensionId) => {
console.log(`init Extension Project "${extensionId}"`);
// todo something you need
});
複製代碼
具體展現效果以下:
經過上面的步驟,咱們已經可以完成一個簡單的腳手架了。下面,咱們須要讀取用戶配置,同時爲用戶生成一些模板文件。
如今,咱們須要讀取用戶的 cm-cli.json
配置文件來進行一些配置。
咱們可使用 Node.js 的 fs
文件模塊來對文件進度讀操做,因爲此處沒有太多難點,所以略去。
咱們提早將模板文件存儲在 CDN 上,再根據本地讀取到的相關腳手架配置文件來進行模板的下載。
注:腳手架中讀取的路徑爲使用者使用時當前路徑,所以沒有辦法將模板文件存儲在腳手架中進行讀取。
咱們可使用諸如 request
這種庫來幫助咱們進行文件下載,簡化操做步驟。執行 npm install request
便可進行安裝。
注:在文件寫入時建議先判斷文件是否存在,再進行覆蓋。
與 Node.js 提供的 API 函數來看,有些人更加傾向於使用 Shell 腳原本進行文件操做。幸運的是,咱們也能夠在咱們的腳手架中引入 node-cmd
來啓用對 Shell 腳本的支持。執行 npm install node-cmd
便可進行安裝。
具體示例以下:
commander
.command('init <extensionId>')
.description('init extension project')
.action((extensionId) => {
id = extensionId;
console.log(`init Extension Project "${extensionId}"`);
cmd.get(
` mkdir -p static/${extensionId} mkdir tmp mkdir tmp/source-file mkdir tmp/build-file curl -o tmp/source-file/index.js https://xxxxxxxx.com?filename=index.js touch tmp/source-file/index.css curl -o tmp/build-file/server.js https://xxxxxxxx.com?filename=server.js curl -o tmp/build-file/router.js https://xxxxxxxx.com?filename=router.js curl -o tmp/build-file/package.json https://xxxxxxxx.com?filename=package.json cp tmp/source-file/* static/${extensionId} cp tmp/build-file/* ./ rm -fr tmp npm install `,
(err, data) => {
console.log(data)
if (!err) {
console.log('init success');
return;
}
console.error('init error');
});
});
複製代碼
咱們能夠快速的使用 Shell 腳原本進行文件夾的建立和文件模板的下載。
腳手架想要在終端可以快速執行,能夠在 package.json
配置文件中增長相關字段。
腳手架須要可以讀取相關終端輸入,可使用 commander
庫來快速開發。
腳手架須要可以執行 Shell 腳本,可使用 node-cmd
庫來快速實現需求。