平常經常使用一些npm cli工具,你是否好奇這些工具又是怎麼開發出來的呢?接下來這篇文章,就會介紹如何利用node.js開發乙個屬於你自己的命令列工具。
首先,我們需要先建立乙個基本的專案結構:
mkdir git-repo-cli
cd git-repo-cli
npm init #初始化專案
接著我們建立所需的檔案:
接著我們先來寫乙個簡單的入口程式,在index.js
檔案中**如下:
const chalk = require('chalk');
const clear = require('clear');
const figlet = require('figlet');
const commander = require('commander');
commander
.command('init')
.description('hello world')
.action(() => )));
});commander.parse(process.ar**);
if (!commander.args.length)
上面的**中引用了chalk
,clear
,figlet
和commander
這幾個npm庫,,其中chalk
負責命令列不同顏色文字的顯示,便於使用者使用。clear
庫負責清空命令列介面,figlet
可以在命令列中以ascii art形式顯示文字。最後commander
庫就是用來實現命令列介面最主要的庫。
寫完**後,我們可以在命令列中輸入如下**啟動:
node index.js init
接著我們就可以看到這樣的結果:
把基本的架子搭起來後,我們就可以開始寫功能模組的**了。
在lib/files.js
檔案中,主要要實現以下兩個功能::
const fs = require('fs');
const path = require('path');
module.exports = catch (err)
},isgitrepository: () => }};
在使用者在執行命令列工具的時候,需要收集一些變數資訊,因此,可以我們需要利用inquirer這個npm庫來實現「詢問模組」。
const inquirer = require('inquirer');
module.exports = else }},
else }}
];return inquirer.prompt(questions);}}
為了實現和github的介面通訊,需要獲得token認證資訊。因此,在lib/github_credentials.js
檔案中,我們獲得token,並借助configstore
庫寫入package.json
檔案中。
const configstore = require('configstore');
const pkg = require('../package.json')
const octokit = require('@octokit/rest')();
const _ = require('lodash');
const inquirer = require("./inquirer");
const conf = new configstore(pkg.name);
module.exports = ,
githubauth: (token) => );
},getstoredgithubtoken: () => ,
setgithubcrendeitals: async () => , credentials))},
registernewtoken: async () => );
const token = response.data.token;
if (token) else
} catch(error) }}
其中@octokit/rest是node端與github通訊主要的庫。
接下來就可以寫我們的介面了:
// index.js
const github = require('./lib/gitub_credentials');
commander.
command('check-token')
.description('check user github credentials')
.action(async () =>
console.log(token);
});
最後,在命令列中輸入如下命令:
node index.js check-token
它會先會在configstore
的預設資料夾下~/.config
尋找token, 如果沒有發現的話,就會提示使用者輸入使用者名稱和密碼後新建一場新的token。
有了token後,就可以執行github的很多的操作,我們以新建倉庫為例:
askrepositorydetails: () => else }},
,];return inquirer.prompt(questions);
},askignorefiles: (filelist) => ];
return inquirer.prompt(questions);
}
接著,實現對應的新建倉庫、新建.gitignore
檔案等操作:
// create_a_repo.js
const _ = require('lodash');
const fs = require('fs');
const git = require('******-git')();
const inquirer = require('./inquirer');
const gh = require('./github_credentials');
module.exports = ;
try catch (error)
},creategitignore: async () => else
} else
},setuprepo: async (url) => catch (err) }}
最後,在index.js
檔案中新建乙個create-repo
的命令,執行整個流程。
// index.js
commander
.command('create-repo')
.description('create a new repo')
.action(async () =>
} catch (error) }}
})
寫完**後,在命令列中執行如下命令即可:
node index.js create-repo
如何了解乙個命令列man
通常是一段描述,通常是命令列的由來 可編寫指令碼的影象處理系統。講解命令列的基本用法,這裡提供了基本的使用格式,一般對於劃線處還會有進一步描述 通常用語簡要描述一下命令列功能應用 針對每乙個選項具體講解,對於劃線處如果不懂,後面會有講述 通常用語講解相關選項,比如這裡就將key的使用做了一些限制 命...
打造乙個全命令列的 Android 構建系統
ide都是給小白程式設計師的,大牛級別的程式設計師一定是命令列控,終端控,你看大牛都是使用vim,emacs 就一切搞定 這話說的雖然有些絕對,但是也不無道理,做開發這行要想效率高,自動化還真是缺少不了命令列工具,因為只有命令列才是最佳的人機互動工具。其實ide也是底層也是呼叫命令列工具而已,只不過...
如何建立屬於自己的乙個論壇
最近突然興起,想建立乙個屬於自己的論壇。剛開始打算自己寫乙個,然後發現,工作量太大。希望能找到乙個原始碼,直接使用即可。找了許多基於ssh的框架的原始碼,但是最後發現都不行,都是各種demo,各種缺功能,需要自己去完善。後面,找到乙個php的框架原始碼,叫discuz,還不錯,可惜了,是php寫的。...