用node編寫自己的cli工具

来源:http://www.cnblogs.com/huanglei-/archive/2017/05/22/6885914.html
-Advertisement-
Play Games

工作中接到新項目,開發前都需要先規劃項目目錄,然後一個個創建文件,搭建sass編譯環境,下載jquery,Swiper等類庫... 這些準備工作都要花上不少時間。每做一個項目,都會遇到同樣的問題,再重覆一遍嗎? 是時候做點改變了:編寫自己的cli工具,一行命令,3秒鐘進入coding狀態! 本文以自 ...


工作中接到新項目,開發前都需要先規劃項目目錄,然後一個個創建文件,搭建sass編譯環境,下載jquery,Swiper等類庫... 這些準備工作都要花上不少時間。每做一個項目,都會遇到同樣的問題,再重覆一遍嗎?
是時候做點改變了:編寫自己的cli工具,一行命令,3秒鐘進入coding狀態!

本文以自己的my-cli為例,將開發到發佈過程完整記錄下來,看完本文,你將學會如何從零開發一個cli項目,如何上傳到github庫,以及如何使用npm發佈自己的包。

準備

開發一個cli工具前首先要想好它能做什麼。以我自己為例,我需要一個工具,讓我能只輸入一行命令就幫我快速搭建好項目結構,就像這樣:
img
是不是很炫酷?放心,很簡單。

開始

首先創建你的cli項目,並使用npm init創建一個package.json。

$ mkdir my-cli && cd my-cli
$ npm init

根據提示一步步創建好package.json。name屬性就是你發佈到npm上的名字,這個是不能與npm上現有項目重名的,一個小技巧是使用npm install下載你想要起的包名字,如果報錯404,那麼你的包名是可用的。最後創建好的package.json文件像這樣子:

{
  "name": "my-cli",
  "version": "0.0.1",
  "description": "Auto generate project template",
  "main": "index.js",
  "bin": {
    "my-cli": "./index.js"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/hlme/my-cli.git"
  },
  "keywords": [
    "cli"
  ],
  "author": "[email protected]",
  "license": "MIT",
  "bugs": {
    "url": "https://github.com/hlme/my-cli/issues"
  },
  "homepage": "https://github.com/hlme/my-cli#readme"
}

編寫可執行文件

package.json中有一個"bin"欄位,配置後才可以在控制台使用你的命令。

"bin": {
  "my-cli": "./index.js"
}

我們配置了"my-cli"命令來執行index.js文件。用你喜歡的編輯器,在項目主目錄下創建一個index.js文件。

註意第一行的"#! node"很重要,表示用node來執行這個文件。如果沒有這句聲明,就會在記事本中打開index.js文件。補充:linux/unix 下應該是#!/usr/bin/env node,參考這篇百度知道

全局安裝你的包

使用 npm install -g 將你當前的項目安裝到全局環境,現在你可以在命令行使用"my-cli"命令了。

用fs模塊快速生成項目模板

我們自定義的指令可以執行了,接下來編寫代碼實現功能。my-cli的主要功能就是生成項目模板,一個思路是用一個templates文件夾保存項目模板,然後通過fs.mkdir()來創建項目目錄,最後把文件從templates文件夾拷貝到項目中去。

var fs = require('fs');
var path = require('path');

function copyTemplate (from, to) {
  from = path.join(__dirname, 'templates', from);
  write(to, fs.readFileSync(from, 'utf-8'))
}
function write (path, str, mode) {
  fs.writeFileSync(path, str)
}
function mkdir (path, fn) {
  fs.mkdir(path, function (err) {
    fn && fn()
  })
}

核心代碼就這麼點,是不是非常簡單?

整個項目文件結構差不多就這個樣子,把你需要的文件放到templates文件夾,然後用copyTemplate方法將文件拷貝到項目目錄下。

創建文件目錄和拷貝文件的過程,代碼看著比較醜陋

接收命令行參數

平常我們使用命令行工具時都會用到參數,如 webpack -p, express -e 等,現在我們來為自己的cli添加接收命令行參數的功能。為my-cli設計四個參數,用來向項目中添加類庫。

$ my-cli -j -s -v -b
//-j :添加jQuery
//-s :添加Swiper
//-v :添加Vue
//-b :添加Bootstrap

使用commander包可以簡化解析參數過程,但是本項目比較簡單,我也不想額外引入其他的包了,處理一些簡單的參數其實並不難。
node中我們可以使用process.argv來獲取命令行參數,process.argv是一個參數數組,第一項為node.exe的絕對路徑,第二項為執行該js的絕對路徑,使用process.argv.slice(2)即可獲取輸入的參數數組。


通過遍歷參數數組來檢查命令中輸入了哪些參數。如果輸入了預設的參數,就為config對象添加對應的屬性,在生成文件時根據onfig判斷是否將模板文件拷貝到項目中。繼續醜陋的代碼:

本地運行

至此我們的項目已經基本完成了,使用 npm install -g 將項目安裝到全局環境,然後新建一個項目文件夾,使用my-cli命令來生成項目模板。

發佈到npm倉庫

要想將自己的包發佈到npm上,首先得有一個npm賬號,創建賬號非常簡單,輸入npm adduser,簡單三步即可完成創建。

創建好user後,使用npm publish即可將當前項目發佈到npm上了,以後就可以使用npm install -g my-cli 來安裝你的cli工具。

上傳到github

開發了自己的npm包,如果想獲得更多人的關註,上傳到github上是個比較好的辦法,推薦一篇教程:Git 遠程倉庫(Github)

結束語

相信大家看完本文後知道如何根據自己的需求製作cli工具了。本文中的my-cli比較簡單,權當做拋磚引玉。如果想查看完整源碼或者使用這個工具,可以戳這裡:github地址


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

-Advertisement-
Play Games
更多相關文章
  • 很多時候,在我們的網站中因為頁面內容過長,用戶瀏覽網頁時若想返回頂部菜單需要滾動滑鼠才能到達,很不方便,為了提高用戶體驗度,我們會在網頁中加入返回頂部功能,以下是php中文網推薦的5款簡潔的返回頂部特效代碼,很值得收藏哦!歡迎分享下載! 1.簡單實用jQuery返回頂部代碼 效果預覽和下載地址:ht ...
  • console.log(typeof 'abc') // "string" console.log(typeof true )// "boolean" console.log(typeof {a:1}) // "object" console.log(typeof function foo(){}) ...
  • 趕工趕工。。 ...
  • 前言 canvas 強大的功能讓它成為了 HTML5 中非常重要的部分,至於它是什麼,這裡就不需要我多作介紹了。而可視化圖表,則是 canvas 強大功能的表現之一。 現在已經有了很多成熟的圖表插件都是用 canvas 實現的,Chart.js、ECharts等可以製作出好看炫酷的圖表,而且幾乎覆蓋 ...
  • 今天在學習HTML5的過程中遇到了中文亂碼問題: 我是用myeclipse 2016開發的,但我的項目和html文件的編碼格式都是utf-8,還是亂碼,去網上搜了搜都沒有搜到,後來發現了一件有趣的事,知道了問題的原因。 每次創建一個新的HTML5文件時,新建的文件都自帶瞭如下代碼: 但當我嘗試著把 ...
  • 實現效果 如圖所示: 首先得準備三張圖,一張是淺黃色的背景圖loading_bg.png,一張是深紅色的圖loading.png,最後一張為bolang.png。 css代碼 html代碼 ...
  • ECMAScript 的語法大量借鑒了C及其他類C語言(如Java 和Perl)的語法。 1. 區分大小寫 2.標識符 2.1 第一個字元必須是一個字母、下劃線(_)或一個美元符號($); 2.2 其他字元可以是字母、下劃線、美元符號或數字 按照慣例,ECMAScript標識符採用駝峰大小寫格式,也 ...
  • 一、相對定位(position:relative) 如果想讓一個元素在本來的位置進行一個位移,可以將該元素的定位設置為relative,同時指定相對位移(利用top,bottom,left,right).需要註意的是,元素仍然在文檔流中,占據著它本來的位置空間. 二、絕對定位(position:ab ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...