準備了兩年的 Semo,今天正式跟你們見面

每隔一段時間都能看見新的討論命令行工具的文章,你們都在探索怎麼用 Node 開發一個命令行工具,並熱情的分享 npm 社區若干優秀的和命令行開發有關的 npm 包。從學習的角度固然也不錯,但我一直以爲怎麼開發命令行工具不是最重要的,而是開發具體有用的命令行工具纔是最重要的。

我在3年前開始從事 Node.js 開發,去了一個不把 Node 當作膠水而是全 Node 後臺架構的公司,對於微服務架構來講,那後端的小項目就多了去了,每一個項目,甚至一個項目裏不一樣的開發者寫的命令行工具(還有一次性腳本和計劃任務)可能都是一套本身的設計,我當時想作一個簡單易用,侵入小的方案,統一微服務架構下各個項目實現命令,腳本,計劃任務等的實現規範。最終造成了 Semo 這個項目,我打算寫一系列的文章跟你們分享 Semo 的原理和用法。git

至於爲何要藏起來兩年多才拿出來,主要是一直以爲作的還不夠好,事實上這兩年也確實改動很大,最近還在作結構的調整和重大特性的添加。github

Semo 是基於 yargs 這個命令行相關的庫開發的,固然還有不少其餘選擇,可是我使用過幾個之後,以爲 yargs 最靈活,凡是 yargs 提供的功能用就行了,個人工做是在外圍在加一些規範和約束,使得用起來更方便。typescript

說了這麼多廢話,仍是直接給你們看貨吧,今天不涉及原理,只是一個簡單介紹,若是你們感興趣能夠裝裝試試,再給點意見和建議。後面會把 Semo 的方方面面好好跟你們說說。npm

安裝

和一些開發框架自帶的命令行工具不同的是,Semo 的命令行工具默認裝上之後不會有什麼直接的好處,想用的爽還須要安裝或者開發本身的插件才能夠。後端

npm i -g @semo/cli
semo help
複製代碼

打印的結果是:bash

$ semo help
semo

Commands:
  semo completion                     Generate completion script
  semo config <op>                    Manage rc config                                                    [aliases: cfg]
  semo create <name> [repo] [branch]  Create a new project from specific repo                               [aliases: c]
  semo generate <component>           Generate component sample code                                        [aliases: g]
  semo init                           Init basic config file and directories                                [aliases: i]
  semo repl                           Play with REPL                                              [default] [aliases: r]
  semo run <PLUGIN> [COMMAND...]      Run any plugin command directly
  semo status                         Show environment status info                                         [aliases: st]

Options:
  --version   Show version number                                                                              [boolean]
  --hook      If or not load all plugins repl hook
  --prompt    Prompt for input.                                                                        [default: ">>> "]
  -h, --help  Show help                                                                                        [boolean]

Find more information at https://semo.js.org
複製代碼

運行

$ semo
>>> 
複製代碼

直接輸入 semo 敲回車,會跟 Node 同樣,進入一個 REPL 環境,表面上這個 REPL 環境只比 Node 的 REPL 環境多了一個 Semo 對象。實際上,這說明咱們能夠經過某種方式往裏面放東西,另外,這個環境裏還可使用 await 運行 Promise 函數。架構

Hello world

爲了給你們留個好的第一印象,我開發了一個 Semo 的 hello world 插件,特別的是,這個插件的體驗不須要經過 npm install 來安裝框架

semo run hello-world
複製代碼

首次運行會有下載動做,以後就不會了,是否是感受有點熟悉(好吧,靈感來自於 Deno 以及 npm init 和 yarn create)函數

你會看到一個輸出:微服務

你好,xxx 同窗:

今天是2020年6月13日, 如今是下午1點51分, 祝你今天一天都有好心情!看看下面一句話是否對你有所啓發:

智者說:我曾聽一位大師說過,誠信是財富,正法是第一坦道,實語是第一妙昧,智慧是第一輩子命。
複製代碼

是否是頗有愛呀,這裏的文案模板支持中英文,而且會自動檢測系統語言,裏面的雞湯能夠換口味的。

# it: IT 語錄
# cn: 中文雞湯
# en: 英文雞湯
# poison: 中文毒雞湯
# rule: 各類法則定律
semo run hello-world --inspirationType it
複製代碼

每次運行都須要指定選項太麻煩了,能夠把選項給我配置固化下來嘛?固然能夠,經過把配置寫到全局配置文件便可。

semo config set semo-plugin-hello-world.inpirationType it -g
複製代碼

配置文件在 ~/.semo/.semorc.yml

關於如何實現這個插件,推薦你們看看插件的源碼,等你們學會了 Semo 的擴展方法之後,還能夠自定義本身的雞湯,用這個插件來背單詞,被 API 語法也不是夢哦!

插件管理

都說沒有插件系統的那啥不是好那啥,咱們這裏固然要支持插件系統啦,那麼都有哪些插件能夠用呢?

semo run plugin --remote
複製代碼

這條命令能夠告訴你答案,你能夠裝幾個插件玩玩,插件能夠裝在幾個位置

  • 跟 semo 同樣裝在 npm 的全局環境
  • semo 在 home 目錄放了一個目錄,目的也是存放全局插件,主要是爲了有權限寫。
  • 最後在項當前目錄,固然就更能夠啦。

這裏以 home 的全局插件爲例,核心提供了一個插件管理命令,不過須要先安裝一下:

semo run plugin plugin install --PLUGIN plugin
複製代碼

這樣,你就會發現全局已經有了 semo plugin 命令,咱們用這個插件真正的把咱們的 hello-world 插件裝下來吧:

semo plugin install hello-world
複製代碼

這樣,你就能夠這樣運行 hello-world 插件定義的 hello-world 命令了:

semo hello-world
複製代碼

再說說內置命令

有了前面的 hello-world 打基礎,如今給你們說說默認安裝後內置的幾個命令的功能:

semo completion

這個命令用來提供自動補全,把輸出粘到 ~/.zshrc 或者 ~/.bashrc 便可。

semo config

這個命令能夠用來管理本地和全局的 .semorc.yml 配置。

semo create

這個命令用來建立新項目,給新項目提供模板,支持 Git 倉庫地址,或者預置模板:

semo create PROJECT --template
複製代碼

核心預置了兩套模板,一個用於開發插件,一個是用於簡單的 typescript 項目解構,都是例子,實際是爲了告訴你們,你們能夠把本身優秀的項目腳手架,starter 給放進來,這樣就能夠一鍵使用本身的模板建立項目了。

semo generate

這個命令用來生成代碼,核心常常用的是添加新命令時的命令模板代碼(支持 js 和 ts)。

semo init

這個命令用於初始化當前目錄,爲任意 Node 項目初始化Semo 配置文件和所需目錄。

semo repl

這是一個 REPL 環境,之後能夠用他來幫助咱們開發,調試和驗證項目邏輯。

semo run

這個命令用於臨時運行一個沒安裝過的插件裏的命令(實際仍是須要下載,只不過只有 run 命令纔會去識別)

semo status

能夠看一些環境信息,支持擴展。

小結

今天要跟你們分享的就是這些,還不夠詳細,只是給你們留一個第一印象,你們能夠試試看,因爲 semo 的原則是核心保持乾淨,不提供任何具體的功能,而且擴展起來很是容易,比較適合你們隨意發揮,不必定非得用在工做上,這一點從目前我提供的一些插件上就可見一斑了哈。

求點贊,求STAR

倉庫地址:github.com/semojs/semo,若是你們喜歡,歡迎你們給個 Star 哈。

技術支持

目前寫了一些文檔,可能還不是很詳細,你們能夠先看着: semo.js.org

很是歡迎你們幫我糾錯,以及編寫本身的插件做品,:)

後面會寫一些具體的原理和擴展方法的介紹文章,你們若是真的已經深刻到須要本身寫擴展時可能會遇到技術問題,能夠掃碼加釘釘羣,你們一塊兒交流哈。

相關文章
相關標籤/搜索