這節課我們講解Bundle的構建和Gemfile的使用方法。之前我們只是兩句話代碼,這節課我們進一步來講解:
什么事bundler?
是rails應用程序中對gem依賴包進行管理的一種管理工具。它會根據Gemfile中的設置自動下載及安裝對應的gem套件並且能夠幫我們解決不同套件之間的依存關系。同時它能夠使得程序在不同的部署環境中使用的所有依賴包的版本都能夠保持一致(因為Gemfile里面就作出限定,不同環境但是都是根據同一個gemfile文件),這樣移植到其他電腦或者讓別人協同開發只要都根據同一個gemfile就能保持一致。
Bundler的作用就是根據Gemfile的設置來保證在任何環境下安裝的gem包都是同一個版本。
rails3的版本如果你想添加任何gem包都必須將其顯式地寫在Gemfile中,與之前更早的版本可以使用require關鍵詞來引入gem包不同。我們現在用的是rails4的版本,統一使用gemfile進行統一管理明顯更加方便,
Gemfile文件的如下代碼表示只有在開發模式和測試模式中才使用里面的byebug這個gem包,如果想生產環境中也使用這個gem包那么在group關鍵詞后面同樣方式添加production就可以了
如下則是只有開發模式才能使用那個gem包
我們建議Gemfile中版本號寫死了比較好,比如,再不濟也要使用波浪號的
(這種方式保證大版本號不變),這樣寫有什么好處呢?能夠最大程度地降低由gem包升級造成的潛在的兼容性的風險,因為ruby和rails開源更新快,所以不把版本寫死很可能會升級到一個新的你不熟悉的版本,從而導致兼容性問題。
比如說,版本號有三部分用點隔開,第一個版本號4發生變動表示發生的是不向下兼容的變動,這是x版本號。如果第二個版本號1發生變動表示有新的功能增加,這是y版本號。如果第三個版本號0變動,表示一些bug的修正,這是z版本號。所以你最不濟也用~>來保證正常使用(大版本號不變,說明頂多是z版本號變動也就是修復一些bug而已)。
至於的>=就避免使用。
這樣就能保證大型項目有一些升級的彈性又不至於升級太多導致不兼容的錯誤。
如果你修改了Gemfile這個文件,比如添加了新的gem包的聲明代碼,或者修改了已有gem包聲明的版本,那么就需要使用一個命令叫bundle install來安裝我們所有的gem包,這個命令會檢查並安裝這些gem包同時生成一個Gemfile.lock文件。Gemfile.lock文件會列出當前工程使用的gem套件的具體版本,那么要注意的是如果你使用git這樣的工具進行工程的同步開發,那么你一定要記得開commit或者push的時候要把Gemfile.lock文件一並推送過去,這樣其他上線的開發者就會安裝這個Gemfile.lock里面指定的庫文件,目的還是一個:保持多人開發gem版本的一致性。
下一個要講的命令就是,bundle update 后面接上gem包的名字(不是gem_name)比如rails就會去更新相應的gem包版本。
只是bundle update后面無gem包名字,那么就是默認更新所有的gem包到最新版本。(不到必要,就別去使用bundle update這個命令,否則因為一次性更新太多gem包導致不兼容的概率是非常高的)。所以想升級gem包我們就在后面添加需要升級的gem包的名字,一次只升級一個就行。
總之,如果有gem包發生變動,那么一般情況下我們bundle install一個命令就能全部搞定。如果這個命令在執行過程中出現無法安裝的gem包,打斷了安裝的運行(這種情況非常常見);那么就需要使用gem命令對這些無法安裝的gem包進行單獨的安裝並根據提示信息來解決可能出現的錯誤。
那么怎么知道哪些gem包在我們工程里可以升級呢?那很簡單,我們可以使用命令,就是已過時的命令這個命令會列出所有新版本、可升級的gem如下我們發現arel已經安裝的版本是6.0.3,最新版本是7.0.0,想升級的話可以選擇它進行升級就可以了。
bundle的命令有很多,實際上使用最多的是bundle install這個命令而已(相當於一鍵搞定按鈕了)