iOS 程序員的 Ruby 初體驗

海賊王極惡世代

在技術浪潮不斷更新發展的時代下,身為程序員的我們不斷的在學習新技術,不斷的更新自己的技能,不斷的和伙伴們一起成長,夢想著有天能航行到技術的頂端。就像海賊王里最惡世代們一樣,只有不斷的挑戰,不斷的成長抱團打倒 BOSS,才可能到達終點得到 ONE PIECE 。

前言

一開始自己去學習 Ruby 只是想了解 Podfile 里寫的東西到底是什么,到后面對 Cocoapod 和 fastlane 源碼和原理的好奇,再到想通過學習到的東西改善自己的工作流。

本篇文章記錄了自己從小白到 Ruby 簡單入門的旅程。

Ruby 學習

做為一個Ruby小白,沒人教,啥都不懂該如何去學習這樣一門新的語言。
沒有別的,只能靠自己程序員的大腦和折騰。

對于新的編程語言我需要去了解他的語法,所以找到這幾個網址:

  1. ruby基礎教程(中文第四版)
  2. Ruby | 菜鳥教程
  3. Ruby China社區

對于 Ruby 語法剛接觸有幾個地方有較深的映像:

  1. 完全面向對象:任何東西都是對象,沒有基礎類型。平時我們使用的1,2,3,4,5,6在Ruby都是 ‘Fixnum’ 類的實例對象,有著屬于自己的方法。

    1.to_s   // 將 1 轉為字符串
    
  2. 方法調用可以省略括號,比如:

        puts("hello, world")
    

    也可以這樣

        puts "hello, world"
    
  3. 代碼塊之間不是用{}來表示代碼塊的范圍 而是 end 來表示塊的結尾。比如定義一個方法 OC 的做法是:

     - (void) method {
        這里是方法實現代碼
     }
    

    而在 Ruby 里:

    def method 
        這里是方法實現代碼
    end
    
  4. 可以用換行替換 “ ; ”,即代碼中可以省略 “ ; ”。

    在 OC 中:

     - (void) method {
        第一行代碼;
        第二行代碼;
     }
    

    Ruby中:

    def method 
        第一行代碼
        第二行代碼
    end
    
  5. 每行代碼都有返回值。

    我們在 irb 中輸入下面代碼(irb內置在shell的ruby解釋器)。

    irb(main):001:0> puts 'hello, world'
    hello, world
    => nil
    

    puts 'hello, world'意為打印'hello, world'字符串。所以我們得到的第一個輸出為正常方法執行的效果,打印出'hello, world'字符串。而第二行

    => nil
    

    則是意味著該行代碼的放回值為nil。

    如果我們的代碼是給一個變量,那這行代碼的返回值將是變量的值,如下:

    irb(main):002:0> a = 1
    => 1
    
  6. 一個有返回值的方法中如果沒有return,則最后一行代碼的返回值就是該方法的返回值。如:

    def method 
        a = 1
    end
    

    該方法的返回值為 1 。

實踐

學習任何編程語言最快的方式就是上手敲。
在了解Ruby大致的語法后,便需要開始尋找工具來進行 Coding 實戰。最后基于工具的學習時間成本先挑選了 irb 和 Sublime Text

irb

全名 “interactive ruby” ,一個命令行工具,也可以看作是Ruby的解釋器。
MacOs下系統自帶,打開終端輸入:

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源碼 )。

通過源碼的閱讀對他們大致總結為:通過 Ruby 來調用終端命令。

這里尤其是fastlane,讀 fastlane 的很多的工具集 ( actions ) 的源碼你會發現里面基本是提供了各種 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,其實很簡單,里面多數都是往command 數組中插入命令,你只要注意遵從 fastlane 對你們的要求格式進行提交你的 action 代碼審核就行。

另外我們在使用 fastlane 進行打包的時候,能清楚的看到其答應出所使用的 xcodebuild 的命令。

其實這些也可以通過 Shell 腳本來實現,那為什么 fastlane,Cocoapods 是用 Ruby 來實現的,筆者猜想可能是因為 fastlane,Cocoapods 本身就是基于 Ruby 開發中的工具 rake 和 bundle 思想而開發出來的吧。

繼續實踐

程序員就是要折騰自己,既然大致原理是通過 Ruby 執行 Shell 命令,那他們能寫很多工具來幫助程序員開發,我自己能寫一個嗎? 不求寫出來的高大上,但求學到的東西能實踐應用,寫出來的東西能方便自己。

于是就有了這個項目 pod_updater,這個項目意在幫助自己擺脫每次提交自己的私有 pod 庫時,總是要在終端輸入一堆 git 命令然后在 push 到 podspec 倉庫等一系繁瑣的操作。

開始實踐

首先感覺 irb 不夠用了,不能對代碼進行調試,而 Sublime Text 只是個編輯器,于是又找到了 RubyMine 。

RubyMine 是一個用于 Ruby 開發的 IDE,可見資料

  1. 有了 IDE 還不夠,有時我們需要使用些成熟的三方庫,所以我們需要了解這些 Gem,bundle,Gemfile.

    Gem:Ruby 應用程式或程式庫。可以理解為Framework。
    bundle: 是管理、解決 gem 之間相依性的工具,它會根據 Gemfile 裡頭的設定自動下載和安裝 gem ,而且幫你解決相依問題。可以理解他為iOS開發中的Cocoapod。
    Gemfile:理解為podfile即可,用于描述程序的相關庫安裝與依賴關系。
    更多資料

  2. Ruby 執行shell 命令
    Ruby執行 shell 命令方式有很多種,可見資料 ,而我選擇是的 IO.popen 方法。

    $ irb
    IO.popen("date") { |f| puts f.gets }
    Wed Jul  4 22:02:31 CST 2012
    => nil
    
  3. 接著就是各種資料查找和折騰,最后模仿 fastlane 和 CocoaPods 將自己的工具做成 gem 的形式,于是我的第一個 RubyGem pod_updater 誕生了,使用效果如下:

    這是pod_updater 終端使用.gif

總結

對于一門新語言,下手實踐才是真道理。

對于自己,學習語言最大的動力莫過于他能幫助自己更好的生活和工作。

今天是 2018 除夕,祝各位程序員同胞新年快樂,過年多吃肉??。

學習資料

  1. ruby基礎教程(中文第四版)
  2. Ruby | 菜鳥教程
  3. Ruby China社區
  4. 簡單筆記一下 RubyGem, Gem, RVM, Gemfile, bundler
  5. Mastering ruby blocks in less than 5 minutes
  6. 在 Ruby 中執行 Shell 命令的 6 種方法
  7. 如何開發一個自己的 Gem
  8. How to Use OptionParser: Ruby's Powerful Parsing Tool
  9. iOS 工程自動化 - Ruby 入門到輔助腳本編寫
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容