[翻譯]使用ruby的commander構(gòu)建CLI-Builidng a CLI Using Ruby Commander

原文在cli-using-ruby-commander

這是一篇使用ruby和commander來構(gòu)建一個命令行交互app(command line interface,CLI).

Gemfile

創(chuàng)建一個工程目錄,創(chuàng)建一個Gemfile.

mkdir ruby-cli
cd ruby-cli
touch Gemfile

這個Gemfile只包含一個gem,即commander:

備注:commander的github已經(jīng)從作者寫文章時候的https://github.com/tj/commander 遷移到了 https://github.com/commander-rb/commander

source "http://rubygems.org"
gem "commander"

運行bundle install.如果你電腦上沒有bundler,首先你需要用gem install bundler來安裝它.

?  bundle install
Fetching gem metadata from http://rubygems.org/...
Resolving dependencies...
Using bundler 2.0.1
Using highline 2.0.2
Using commander 4.4.7
Bundle complete! 1 Gemfile dependency, 3 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.

翻譯補充: gem可以安裝一個包的很多個版本,那么對于多個版本所產(chǎn)生的問題,怎么解決呢?
Bundler https://bundler.io 就是為了解決這個問題的, 它提供了兩個命令
bundle install :根據(jù)Gemfile中申明的gem全部安裝,并將版本號等寫入Gemfile.lock文件,保證不同的機器執(zhí)行的時候,獲取到的都是相同的依賴包
bundle exec:替我們解決了多版本環(huán)境不隔離的問題。當你執(zhí)行 bundle exec的時候,Bundler 會把 LOAD_PATH中不相干的那些 gem 的路徑全都去掉拥诡,然后讀取 Gemfile.lock 中的 gem 版本(如果沒有 Gemfile.lock 會決議版本后創(chuàng)建一個 Gemfile.lock),保證 $LOAD_PATH中只存在 Gemfile.lock 中已經(jīng)固定版本的 gem 的路徑

代碼

下面是我們創(chuàng)建的的文件名為rbuy-cli.rb的示例代碼:

#!/usr/bin/env ruby

require 'rubygems'
require "bundler/setup"
require 'commander/import'

program :name, "Ruby CLI"
program :version, '1.0.0'
program :description, 'A simple cli that does nothing'

command :extract do |c|
        c.syntax = 'ruby-cli extract foo -bar=123'
        c.description = 'Extract foo and bar'
        c.option '--bar STRING', String, 'Option bar with a string'
        c.action do |args, options|
                options.default :bar => 'BAR'
                puts 'Extracting..'
                puts "Args: #{args}"
                puts "Option Bar: #{options.bar}"
        end
end

我們現(xiàn)在可以運行ruby ruby-cli.rb extract.當然了,由于這個文件頭部添加了使用ruby來解釋的聲明,還可以簡單地使用./ruby-cli.rb來運行.(當然,首先還是得使用chmod a+x ruby-cli.rb來讓這個文件具有可執(zhí)行權(quán)限,否則是不可以直接調(diào)用的).

譯者注

當你運行上面的命令的時候,你可能會遇到和我一樣的問題

You must use Bundler 2 or greater with this lockfile.

當你檢查

?  bundle -v
Bundler version 2.0.1

明明bundle已經(jīng)是2.x的版本了,怎么還提示這個錯誤呢?
我們可以通過 gem list來查看本地的bundle
看到

?  gem list

*** LOCAL GEMS ***

activesupport (4.2.11.1)
addressable (2.6.0)
atomos (0.1.3)
aws-sdk (1.67.0)
aws-sdk-v1 (1.67.0)
babosa (1.0.2)
bigdecimal (default: 1.4.1)
bundler (2.0.1, default: 1.17.3)
.......

從上面我們可以看到,對于我們這個版本的ruby(我的是2.6.0),它默認裝載的是bundle1.17.3.
解決的辦法很簡單,就是在
ruby-cli.rb文件的
require "bundler/setup"的上面添加require 'bundler'.

繼續(xù)

從上面的示例,可以看到,通過commander,我們可以很容易的描述我們的CLI.運行

./ruby-cli.rb --help

,將會展示一個非常友好的關(guān)于所有支持的命令的幫助信息.在我們上面的rb文件中,只定義了一個名字為extract的命令.

在我們的extract命令中,我們打印了所有的參數(shù)和選項.

這里,只要一個選項 --bar,它帶有一個默認的字符串"BAR".

Ruby Gem

直到現(xiàn)在為止,我們都是用 ruby ./ruby-cli.rb ... 來運行的.

其實我們可以將其制作成一個gem包,然后直接像其它命令那樣,運行 ruby-cli ...

為了實現(xiàn)制作一個gem包,
我們創(chuàng)建一個bin目錄,將腳本移動到bin目錄下,并且去掉.rb后綴.

mkdir bin
mv ruby-cli.rb bin/ruby-cli

移動后,我們的目錄應(yīng)該是這樣

.
├── Gemfile
├── Gemfile.lock
└── bin
    └── ruby-cli

現(xiàn)在,我們創(chuàng)建一個文件 ruby-cli.gemspec
添加內(nèi)容

Gem::Specification.new do |s|
  s.name = 'ruby-cli'
  s.version = '1.0.0'
  s.date = '2015-12-25'
  s.summary = "Our simple CLI"
  s.description = "Our very very simple CLI"
  s.authors = [ "Luke Skywalker" ]
  s.email = 'lukeskywalker@gmail.com'
  s.executables << 'ruby-cli'

  s.add_dependency 'commander'
end

現(xiàn)在,編譯這個gem:

gem build ruby-cli.gemset

沒有錯誤的話,會在目錄下生成文件 ruby-cli-1.0.0.gem

現(xiàn)在,我們已經(jīng)得到了一個gem的安裝文件

通過如下命令來安裝它:

gem install ruby-cli-1.0.0.gem

現(xiàn)在,你可以直接運行這個命令了

?  ruby-cli gem install ruby-cli-1.0.0.gem
Successfully installed ruby-cli-1.0.0
Parsing documentation for ruby-cli-1.0.0
Installing ri documentation for ruby-cli-1.0.0
Done installing documentation for ruby-cli after 0 seconds
1 gem installed
?  ruby-cli ruby-cli extract foo -bar=1213
Extracting..
Args: ["foo"]
Option Bar: ar=1213

PS:這是我寫的第一個Ruby教程.對于使用Ruby,我內(nèi)心已經(jīng)掙扎過很多次了,因為像Python和Go這樣的語言已經(jīng)很棒了,并且,我也確信,有一天可以使用Apple的Swift語言來編寫腳本.
我不得不使用Ruby的最主要原因是,有很多現(xiàn)有的工具都是用Ruby構(gòu)建的,例如,我最愛的諸多工具中的Jekyll和Fastlane.

譯者添加

我們可以卸載它,卸載的時候,是不帶版本號的!!

?  ruby-cli gem uninstall ruby-cli
Remove executables:
    ruby-cli

in addition to the gem? [Yn]  Y
Removing ruby-cli
Successfully uninstalled ruby-cli-1.0.0
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末力奋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子幽七,更是在濱河造成了極大的恐慌景殷,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件澡屡,死亡現(xiàn)場離奇詭異猿挚,居然都是意外死亡,警方通過查閱死者的電腦和手機驶鹉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門绩蜻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人室埋,你說我怎么就攤上這事办绝∫猎迹” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵孕蝉,是天一觀的道長屡律。 經(jīng)常有香客問我,道長昔驱,這世上最難降的妖魔是什么疹尾? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任上忍,我火速辦了婚禮骤肛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘窍蓝。我一直安慰自己腋颠,他們只是感情好,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布吓笙。 她就那樣靜靜地躺著淑玫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪面睛。 梳的紋絲不亂的頭發(fā)上絮蒿,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音叁鉴,去河邊找鬼土涝。 笑死,一個胖子當著我的面吹牛幌墓,可吹牛的內(nèi)容都是我干的但壮。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼常侣,長吁一口氣:“原來是場噩夢啊……” “哼蜡饵!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起胳施,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤溯祸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后舞肆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體焦辅,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年胆绊,在試婚紗的時候發(fā)現(xiàn)自己被綠了氨鹏。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡压状,死狀恐怖仆抵,靈堂內(nèi)的尸體忽然破棺而出跟继,到底是詐尸還是另有隱情,我是刑警寧澤镣丑,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布舔糖,位于F島的核電站,受9級特大地震影響莺匠,放射性物質(zhì)發(fā)生泄漏金吗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一趣竣、第九天 我趴在偏房一處隱蔽的房頂上張望摇庙。 院中可真熱鬧,春花似錦遥缕、人聲如沸卫袒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽夕凝。三九已至,卻和暖如春户秤,著一層夾襖步出監(jiān)牢的瞬間码秉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工鸡号, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留转砖,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓膜蠢,卻偏偏與公主長得像堪藐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子挑围,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容