在技術浪潮不斷更新發(fā)展的時代下,身為程序員的我們不斷的在學習新技術找岖,不斷的更新自己的技能,不斷的和伙伴們一起成長兴革,夢想著有天能航行到技術的頂端蜜唾。就像海賊王里最惡世代們一樣,只有不斷的挑戰(zhàn)擎勘,不斷的成長抱團打倒 BOSS颖榜,才可能到達終點得到 ONE PIECE 煤裙。
前言
一開始自己去學習 Ruby 只是想了解 Podfile 里寫的東西到底是什么噪漾,到后面對 Cocoapod 和 fastlane 源碼和原理的好奇,再到想通過學習到的東西改善自己的工作流欣硼。
本篇文章記錄了自己從小白到 Ruby 簡單入門的旅程分别。
Ruby 學習
做為一個Ruby小白,沒人教耘斩,啥都不懂該如何去學習這樣一門新的語言。
沒有別的坞笙,只能靠自己程序員的大腦和折騰荚虚。
對于新的編程語言我需要去了解他的語法,所以找到這幾個網(wǎng)址:
對于 Ruby 語法剛接觸有幾個地方有較深的映像:
-
完全面向?qū)ο螅喝魏螙|西都是對象梯澜,沒有基礎類型渴析。平時我們使用的1,2咆疗,3母债,4,5毡们,6在Ruby都是 ‘Fixnum’ 類的實例對象,有著屬于自己的方法登颓。
1.to_s // 將 1 轉(zhuǎn)為字符串
-
方法調(diào)用可以省略括號青责,比如:
puts("hello, world")
也可以這樣
puts "hello, world"
-
代碼塊之間不是用{}來表示代碼塊的范圍 而是 end 來表示塊的結(jié)尾取具。比如定義一個方法 OC 的做法是:
- (void) method { 這里是方法實現(xiàn)代碼 }
而在 Ruby 里:
def method 這里是方法實現(xiàn)代碼 end
-
可以用換行替換 “ ; ”暇检,即代碼中可以省略 “ ; ”婉称。
在 OC 中:
- (void) method { 第一行代碼; 第二行代碼; }
Ruby中:
def method 第一行代碼 第二行代碼 end
-
每行代碼都有返回值。
我們在 irb 中輸入下面代碼(irb內(nèi)置在shell的ruby解釋器)王暗。
irb(main):001:0> puts 'hello, world' hello, world => nil
puts 'hello, world'意為打印'hello, world'字符串俗壹。所以我們得到的第一個輸出為正常方法執(zhí)行的效果,打印出'hello, world'字符串绷雏。而第二行
=> nil
則是意味著該行代碼的放回值為nil。
如果我們的代碼是給一個變量坤检,那這行代碼的返回值將是變量的值期吓,如下:
irb(main):002:0> a = 1 => 1
-
一個有返回值的方法中如果沒有return,則最后一行代碼的返回值就是該方法的返回值箭跳。如:
def method a = 1 end
該方法的返回值為 1 悬襟。
實踐
學習任何編程語言最快的方式就是上手敲拯刁。
在了解Ruby大致的語法后,便需要開始尋找工具來進行 Coding 實戰(zhàn)割捅。最后基于工具的學習時間成本先挑選了 irb 和 Sublime Text
irb
全名 “interactive ruby” 帚桩,一個命令行工具,也可以看作是Ruby的解釋器莫瞬。
MacOs下系統(tǒng)自帶,打開終端輸入:
irb
即可啟動疼邀。啟動后就可以輸入Ruby代碼的,注意每輸入一行代碼获询,irb都會給你返回該行代碼的返回值拐袜,如剛剛出示的代碼log
irb(main):001:0> puts 'hello, world'
hello, world
=> nil
Sublime Text
Sublime Text 是一套很好跨平臺的文字編輯器,如果想要編寫很長的 Ruby 代碼在 irb 不是很方便尝哆,所以選擇了它甜攀。( Sublime Text 維基百科 )
閱讀源碼
通過一段時間的實踐理解,大致對 Ruby 有初步的認識印衔,可以嘗試閱讀 fastlane, cocoapod 源碼來對它們進行理解了 ( fastlane源碼姥敛,CocoaPods源碼 )。
通過源碼的閱讀對他們大致總結(jié)為:通過 Ruby 來調(diào)用終端命令与帆。
這里尤其是fastlane墨榄,讀 fastlane 的很多的工具集 ( actions ) 的源碼你會發(fā)現(xiàn)里面基本是提供了各種 shell 命令的合集。如 action : pod_lib_lint 的 源碼中可看到:
command << "pod lib lint"
if params[:verbose]
command << "--verbose"
end
if params[:sources]
sources = params[:sources].join(",")
command << "--sources='#{sources}'"
end
if params[:allow_warnings]
command << "--allow-warnings"
end
源碼中可以看到里面提供了我們平時在 Shell 中主動輸入的一些命令阵翎。
所以如果你想做一個 fastlane 的 action之剧,其實很簡單,里面多數(shù)都是往command 數(shù)組中插入命令背稼,你只要注意遵從 fastlane 對你們的要求格式進行提交你的 action 代碼審核就行蟹肘。
另外我們在使用 fastlane 進行打包的時候俯树,能清楚的看到其答應出所使用的 xcodebuild 的命令贰盗。
其實這些也可以通過 Shell 腳本來實現(xiàn),那為什么 fastlane童太,Cocoapods 是用 Ruby 來實現(xiàn)的书释,筆者猜想可能是因為 fastlane,Cocoapods 本身就是基于 Ruby 開發(fā)中的工具 rake 和 bundle 思想而開發(fā)出來的吧爆惧。
繼續(xù)實踐
程序員就是要折騰自己,既然大致原理是通過 Ruby 執(zhí)行 Shell 命令芍耘,那他們能寫很多工具來幫助程序員開發(fā)熄阻,我自己能寫一個嗎? 不求寫出來的高大上坝初,但求學到的東西能實踐應用钾军,寫出來的東西能方便自己。
于是就有了這個項目 pod_updater拗小,這個項目意在幫助自己擺脫每次提交自己的私有 pod 庫時樱哼,總是要在終端輸入一堆 git 命令然后在 push 到 podspec 倉庫等一系繁瑣的操作。
開始實踐
首先感覺 irb 不夠用了勾栗,不能對代碼進行調(diào)試盏筐,而 Sublime Text 只是個編輯器砸讳,于是又找到了 RubyMine 界牡。
RubyMine 是一個用于 Ruby 開發(fā)的 IDE漾抬,可見資料。
-
有了 IDE 還不夠挽荠,有時我們需要使用些成熟的三方庫平绩,所以我們需要了解這些 Gem,bundle跃赚,Gemfile.
Gem:Ruby 應用程式或程式庫性湿。可以理解為Framework肤频。
bundle: 是管理宵荒、解決 gem 之間相依性的工具,它會根據(jù) Gemfile 裡頭的設定自動下載和安裝 gem 骇扇,而且?guī)湍憬鉀Q相依問題〖痰停可以理解他為iOS開發(fā)中的Cocoapod稍走。
Gemfile:理解為podfile即可,用于描述程序的相關庫安裝與依賴關系粱胜。
更多資料 -
Ruby 執(zhí)行shell 命令
Ruby執(zhí)行 shell 命令方式有很多種狐树,可見資料 ,而我選擇是的 IO.popen 方法涯曲。$ irb IO.popen("date") { |f| puts f.gets } Wed Jul 4 22:02:31 CST 2012 => nil
-
接著就是各種資料查找和折騰,最后模仿 fastlane 和 CocoaPods 將自己的工具做成 gem 的形式拨黔,于是我的第一個 RubyGem pod_updater 誕生了绰沥,使用效果如下:
這是pod_updater 終端使用.gif
總結(jié)
對于一門新語言徽曲,下手實踐才是真道理。
對于自己疟位,學習語言最大的動力莫過于他能幫助自己更好的生活和工作。
今天是 2018 除夕绍撞,祝各位程序員同胞新年快樂得院,過年多吃肉??。