從零開始制作cli工具,快速創建項目腳手架


背景

在工作過程中,我們常常會從一個項目工程復制代碼到一個新的項目,改項目配置信息、刪除不必要的代碼。

這樣做的效率比較低,也挺繁瑣,更不易於分享協作。

所以,我們可以制作一個cli工具,用來快速創建一個新項目的腳手架。如vue-cli就是一個非常好用的cli工具。

PS:cli 是一個全局安裝的 npm 包。

目標

制作一個cli工具,步驟如下:

1、將我們的工程模板放到Github上。

如果工程模板有很多個,可以新建一個Organizations,統一放置到這里面。我工程模板有很多個,會統一放Organizations下面。

如果工程模板是放在公司gitlab上,則可以新建一個Group來統一管理。

2、定義控制台命令,包含其參數。

參數一般有 -v 顯示包版本, -h 顯示幫助信息,create 作為創建項目的命令參數。

如vue-cli的創新項目命令是 vue create [name]。

3、創建一個npm包工程,實現以上command功能。

如今Github已有很多cli工具,可以clone一個作為參考模板。

PS:我做的cli工具將在最下面放出鏈接。

問題

剛開始要做cli工具時,我頭腦里就有幾個問題。

1、怎么快速獲取到輸入的命令行參數?

我相信已有好的npm包可以完成這功能,我不想自己再從頭做一遍。

2、怎么做選項選擇功能、文字輸入?

由於我的工程模板會有很多個,就想做個選項功能,創建工程時可以選擇其中一個模板。

3、怎么優雅地輸出日志?

console.log雖然可以用,但樣式不好看,需要區分info、error日志。

方法

1、怎么快速獲取到輸入的命令行參數?

yargs模塊能夠解決如何處理命令行參數。

2、怎么做選項選擇功能、文字輸入?

inquirer模塊能夠處理命令行交互。

3、怎么優雅地輸出日志?

chalk模塊解決字符串樣式問題。

具體實現步驟

1、獲取模板列表

2、設置模板選項

3、獲取模板的tag列表

4、設置tag選項

5、設置項目信息輸入

6、下載zip_ball,並復制到目標位置

7、修改項目的信息

具體實現代碼

 1 #!/usr/bin/env node
 2 
 3 var yargs = require("yargs");
 4 var info = require("./info.js");
 5 
 6 var args = yargs
 7     .command({
 8         command: "create <name>",
 9         desc: "Create a bingolink template.",
10         builder: {},
11         handler: function(argv) {
12             var projectName = argv.name;
13             //1.獲取模板列表
14             info.getTemplates(function(templates){
15                 //2.設置選項
16                 info.showTemplateList(templates, (templateName) => {
17                     var t = templates.find((template) => {
18                         return template.name == templateName;
19                     });
20                     //3.獲取標簽列表
21                     info.getTags(t.tagsUrl, (tags) => {
22                         //4.設置選項
23                         info.showTagList(tags, (tagName) => {
24                             var tag = tags.find((tag) => {
25                                 return tag.name == tagName;
26                             });
27                             //5.項目信息輸入
28                             info.showProjectInputView(projectName, (project) => {
29                                 projectName = project.project_name;
30                                 //6.下載zip_ball,並復制到目標位置
31                                 info.downloadZipball(tag.zipUrl, projectName, () => {
32                                     //7.修改項目的信息
33                                     info.editProjectInfo(project);
34                                 })
35                             })
36                         })
37                     })
38                 })
39             })
40         }
41     })
42     .version() // Use package.json's version
43     .help()
44     .alias({
45         "h": "help",
46         "v": "version"
47     })
48     .strict(true)
49     .demandCommand()
50     .argv;
View Code

上面是入口js的代碼,雖然有回調地獄,但還算比較清晰。

其他代碼就不貼上,可以clone我的工程下來看。

工程地址:https://github.com/codingforme/bingolink-cli

發布npm包

1、npm adduser

在發布npm包前,需要先登錄npm。

2、npm publish

在工程的根目錄,執行這命令即可。

附錄

1、npm adduser可能會出現如下的錯誤。

出現第一錯誤時,有人說要在Username前加個~號。

我加了,也確實顯示登錄成功了,但還是怎么都發布不上,一直顯示User Not Found。

所以我重新注冊了一個npmjs帳號,然后npm logout,再npm adduser新帳號,才發布成功!!!

 

本文為原創文章,轉載請保留原出處,方便溯源,如有錯誤地方,謝謝指正。

本文地址 :http://www.cnblogs.com/lovesong/p/10847433.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM