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

来源:https://www.cnblogs.com/lovesong/archive/2019/05/11/10847433.html
-Advertisement-
Play Games

背景 在工作過程中,我們常常會從一個項目工程複製代碼到一個新的項目,改項目配置信息、刪除不必要的代碼。 這樣做的效率比較低,也挺繁瑣,更不易於分享協作。 所以,我們可以製作一個cli工具,用來快速創建一個新項目的腳手架。如vue-cli就是一個非常好用的cli工具。 PS: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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近發現一個非常奇怪的阻塞問題,如下截圖所示(來自監控工具DPA),會話583被會話1036阻塞,而且阻塞發生在tempdb,被阻塞的SQL如下截圖所示,會話等待類型為LCK_M_S 因為DPA工具不好截取全部信息,使用下麵SQL語句獲取了阻塞會話的詳細信息如下,來自Microsoft SQL Se... ...
  • [20190510]rman備份的疑問7.txt--//上午測試rman備份時備份文件大小回縮的測試.鏈接:--//http://blog.itpub.net/267265/viewspace-2643804/ => [20190509]rman備份的疑問5.txt --//自己又認真會看自己以前寫 ...
  • 根據需求,需要把某一些數字或字元串進行格式化,前導或後導字元串。Insus.NET把這個功能寫成一個自定義函數。需要時,直接使用即可。 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- -- Author: Insus.NET -- Create ...
  • 先上效果圖 使用註意事項 1:註意在app.json中註冊頁面路徑 2:如果要增加新的Item,可到js中對listService數組進行增加 3:listService參數[ title:分類標題 items:這個分類下的所有Item[ name:這個Item的名字 url:這個Item點擊跳轉路 ...
  • 前言 最近有需求需要實現插卡預設打開Volte功能,順帶研究了下Volte的流程,在此做個記錄 開始 從Settings設置界面入手,網路和互聯網 移動網路 VoLTE高清通話(電信卡)/增強型4G LTE模式(移動卡) 找到網路和互聯網載入對應的Fragment為NetworkDashboardF ...
  • 一、概述 相較於png、jpg等點陣圖通過存儲像素點來記錄圖像,svg (Scalable Vector Graphics)擁有一套自己的語法,通過描述的形式來記錄圖形。Android並不直接使用原始的svg格式圖片,而是將其轉化為VectorDrawable。VectorDrawable是一個xml ...
  • 一、Context概念理解 Google解釋如下: Interface to global information about an application environment. This is an abstract class whose implementation is provided ...
  • csr8670是我們csr86xx藍牙音頻soc系列中的高級快閃記憶體產品,旨在提供高質量的無線音頻性能並支持高差異優質無線音頻產品的開發。 csr8670是csr 86xx系列的一部分,這是一系列用於無線音頻應用的硅平臺,集成了雙模式藍牙收音機、低功耗dsp、一個應用處理器,一個電池充電器,存儲器和各種 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...