← 上一章:生態圈及簡介 下一章:開發工具與常用命令列指令 →
環境設定
要開始用 Ruby 或 Rails 來開發網站之前,第一件事(其實可能也是最難的事?)就是要先搞定開發環境。
安裝 Ruby
Unix/Linux 作業系統
如果您使用的是 Ubuntu 之類的系統,可以直接使用 apt-get
來安裝 Ruby:
$ sudo apt-get install ruby
如果是 CentOS 之類的系統,則是使用 yum
來安裝:
$ sudo yum install ruby
因為使用了 sudo
指令,所以你應該會被提示需要輸入目前的登入密碼。
Mac 作業系統
如果是 Mac 作業系統,比較新的版本均已內建 Ruby 2.0 版本,如果沒有的話,建議可使用 Homebrew 這個套件管理工具來安裝 Ruby:
$ brew install ruby
Windows 作業系統
在 Windows 平台可根據您的需求,選擇安裝 Ruby Installer 或 Rails Installer,基本上 Rails Installer 跟 Ruby Installer 沒太大的差別,只是後者多加入了 Rails 開發的相關工具(例如 Git、Bundler 等):
其它系統
更多其它平台的安裝方式,或是想要直接下載原始碼自行編譯,請參閱 Ruby 官方網站的安裝說明。
用 RVM 來管理 Ruby 版本
Ruby 有許多的版本(1.8/1.9/2.0/2.1/2.2/2.3/2.4)以及眾多的分支實作品(例如 JRuby/IronRuby/Rubinius/Macruby/mruby 等),算一算有不少排列組合,如果想要在自己機器上安裝不同版本會有點麻煩,而且萬一亂裝把工作環境弄壞了還得花時間重建。如果是要裝在伺服器上,如果你不是系統管理員,還不一定有足夠的權限可以安裝。使用 VirtualBox 的軟體可以模擬作業環境,玩壞了隨時都可以很快的還原或重建一個新的,即使這樣還是有點麻煩。
如果各位跟我一樣都喜歡玩些新玩具,但又擔心環境被弄髒弄壞,推薦大家可以試試 RVM(Ruby Version Manager)。有 RVM 的幫忙,你可以安心的在電腦裡同時安裝多個不同版本的 Ruby/Rails 而不會搞混,隨時都可以輕鬆的切換。
RVM 是把程式安裝在你的個人帳號目錄下,不需要的時候就把整個 ~/.rvm
資料夾刪除就行了,不會影響原來系統的設定。也就是因為 RVM 是安裝在你的個人帳號底下,所以在安裝過程中不需要管理者(root)的權限就可以安裝其它相關的套件。
安裝 RVM
RVM 的安裝滿簡單的,只要兩行指令即可完成。安裝步驟請直接參閱 RVM 官網的安裝說明。
使用 RVM
接著我們來看一些在 RVM 裡常用的指令。在終端機下輸入 rvm list known
會列出目前有哪些可以安裝的列表:
$ rvm list known
# MRI Rubies
[ruby-]1.8.6[-p420]
[ruby-]1.8.7[-head] # security released on head
[ruby-]1.9.1[-p431]
[ruby-]1.9.2[-p330]
[ruby-]1.9.3[-p551]
[ruby-]2.0.0[-p648]
[ruby-]2.1[.10]
[ruby-]2.2[.6]
[ruby-]2.3[.3]
[ruby-]2.4[.1]
ruby-head
[...略...]
macruby[-0.12]
macruby-nightly
macruby-head
# IronRuby
ironruby[-1.1.3]
ironruby-head
幾乎目前常見的 Ruby 分支實作品都有。但如果你發現在這個列表裡的 Ruby 版本過於老舊、沒有最新版本的 Ruby,可以跑一下指令更新一下目前已支援版本列表:
$ rvm get master
在 rvm list known
的列表裡的中括號表示是可以省略的,如果你這樣輸入:
$ rvm install 2.4
RVM 會自動找 [ruby-]2.4[.1]
這個版本的 Ruby 來安裝。前面提到可以安裝多個不同的版本,如果你喜歡,也可以再裝個 1.9.3
的版本:
$ rvm install 1.9.3
安裝完成後,可以使用 rvm list
來查看目前電腦裡已經安裝哪些版本的 Ruby:
$ rvm list
ruby-1.9.3-p551 [ x86_64 ]
ruby-2.2.1 [ x86_64 ]
ruby-2.2.2 [ x86_64 ]
ruby-2.3.0 [ x86_64 ]
ruby-2.3.1 [ x86_64 ]
ruby-2.3.3 [ x86_64 ]
=* ruby-2.4.1 [ x86_64 ]
# => - current
# =* - current && default
# * - default
因為工作上需求,所以在我的電腦上裝了好幾個版本的 Ruby。在 2.4.1 版前面的 =*
符號則是表示我目前正在使用這個版本(同時也是目前預設的 Ruby 版本)。你可以在終端機下輸入這個指令,看看目前 Ruby 的版本:
$ ruby -v
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin16]
如果要切換到其它版本的 Ruby,例如想要切換到 1.9.3 版本:
$ rvm use 1.9.3
想少打幾個字的話,use
也可以省略:
$ rvm 1.9.3
再來看一下Ruby的版本:
$ ruby -v
ruby 1.9.3p551 (2014-11-13 revision 48407) [x86_64-darwin13.4.0]
這樣就切換到 Ruby 1.9.3 了,相當便利!不過有個小問題,就是使用 RVM 指定的 Ruby 版本會在每次開啟新的終端機視窗的時候變回預設值(也就是變回系統內建的 Ruby 版本),如果你希望每次開終端機視窗的時候都會自動切到 2.4.1
版的話:
$ rvm 2.4.1 --default
這樣之後每次開終端機視窗就會自動幫你切換到 2.4.1 版了。如果想切回到原來系統內建的版本,只要執行這個指令:
$ rvm system
想移除某個版本的 Ruby:
$ rvm uninstall 2.4.1
這樣就可以把 2.4.1
版本移除掉了。如果是整個 RVM 都不想要了,只要把個人目錄底下的 .rvm
資料夾整個移除,就會整個清潔溜溜了,完全不會動到系統內建的 Ruby。
RVM 切換版本的運作原理
你也許會好奇為什麼 RVM 可以這麼神奇的切換 Ruby 的環境。讓我們來把系統的 PATH 變數印出來看看:
$ echo $PATH
/Users/user/.rvm/gems/ruby-2.4.1/bin:/Users/user/.rvm/gems/ruby...[略]...
然後查看一下 Ruby 的位置:
$ which ruby
/Users/user/.rvm/rubies/ruby-2.4.1/bin/ruby
再查一下 Ruby 版本:
$ ruby -v
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin16]
(以上內容是我自己電腦裡的設定,應該跟各位的環境不同)
接下來把 RVM 切換到 1.9.3 版本:
$ rvm 1.9.3
再重複把剛剛的那些資訊印出來:
$ echo $PATH
/Users/user/.rvm/gems/ruby-1.9.3-p551/bin:/Users/user/.rvm/gems...[略]...
$ which ruby
/Users/user/.rvm/rubies/ruby-1.9.3-p551/bin/ruby
$ ruby -v
ruby 1.9.3p551 (2014-11-13 revision 48407) [x86_64-darwin13.4.0]
仔細比較一下上面的輸出結果,就會發現 RVM 其實是把不同版本的 Ruby 安裝在你的個人帳號底下的 .rvm
目錄裡。當切換不同版本的 Ruby 的時候,RVM 會幫你把系統預設的 PATH 的最前面冠上這個 .rvm
目錄的路徑。接下來當你在終端機底下輸入 ruby
指令時,系統原本的 /usr/bin/ruby
因為在 PATH 的比較後面的位置,所以系統只會先找到 RVM 版本的 Ruby(也就是原來系統的 Ruby 被鬼摭眼了)。如果各位有興趣,也可以試著輸入 rvm info
指令來看看 RVM 幫你做了哪些設定。
除了 RVM 之外…
我自己習慣使用 RVM,除了 RVM 之外還有其它的選擇,例如 rbenv 及 chruby,這些 Ruby 版本管理工具各有其優、缺點,還請大家自己去試用看看,然後選一套自己覺得順手的來用吧。
安裝 Rails
完成 Ruby 安裝後,接下來就準備來安裝 Rails。在開放原始碼的圈子,有非常多的善心人士開發了功能強大又可免費取用的套件,在 Ruby 的世界我們稱它叫 gem
。Ruby on Rails 這個網站開發框架本身也是一個 gem(更準確的說,應該是一群 gem 的集合體),要安裝 rails 的話,只要使用 gem install
指令加上套件名稱即可,像這樣:
$ gem install rails
Fetching: i18n-0.8.4.gem (100%)
Successfully installed i18n-0.8.4
Fetching: thread_safe-0.3.6.gem (100%)
Successfully installed thread_safe-0.3.6
Fetching: tzinfo-1.2.3.gem (100%)
Successfully installed tzinfo-1.2.3
Fetching: concurrent-ruby-1.0.5.gem (100%)
Successfully installed concurrent-ruby-1.0.5
Fetching: activesupport-5.1.1.gem (100%)
Successfully installed activesupport-5.1.1
Fetching: rack-2.0.3.gem (100%)
Successfully installed rack-2.0.3
...[略]...
36 gems installed
從安裝過程的訊息可大概看到安裝套件的版本 5.1.1
的字樣。如果過程沒發生錯誤訊息,接下來確認一下是不是安裝了正確的版本:
$ rails -v
Rails 5.1.1
搞定!接下來,我們就要用它來建立第一個 Rails 專案了。
如果想安裝別的版本?
在安裝 gem 的時候,可以指定想要安裝的版本:
$ gem install rails -v 4.2.6
如果沒有特別指定版本,預設會去找目前最新的穩定版本,在本書撰寫的當下是 5.1.1
版。如果在後面接的是 --pre
參數,則會安裝最新的測試版本。
建立 Rails 專案
Rails 安裝完成後,接下來就用它來產生一個名為 hello_rails
的 Rails 專案,建立新專案用的是 new
這個參數:
$ rails new hello_rails
create
create README.md
create Rakefile
create config.ru
create .gitignore
create Gemfile
create app
...[略]...
create vendor/assets/javascripts/.keep
create vendor/assets/stylesheets
create vendor/assets/stylesheets/.keep
remove config/initializers/cors.rb
run bundle install
Fetching gem metadata from https://rubygems.org/..........
Fetching version metadata from https://rubygems.org/..
Fetching dependency metadata from https://rubygems.org/.
...[略]...
Using rails 5.1.1
Using sass-rails 5.0.6
Bundle complete! 16 Gemfile dependencies, 70 gems now installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.
run bundle exec spring binstub --all
* bin/rake: spring inserted
* bin/rails: spring inserted
rails new hello_rails
這個指令會幫你產生一個名為 hello_rails
的專案目錄,在產生專案完成後,它會自動開始執行 bundle install
指令,先安裝專案所需要的套件,這個步驟可能會需要一點時間。接下來請使用 cd
指令進到剛剛產生的專案:
$ cd hello_rails
進到這個專案之後,什麼事都不用做,直接啟動 Rails 內建的 web server:
$ bin/rails server
=> Booting Puma
=> Rails 5.1.1 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.9.1 (ruby 2.4.1-p111), codename: Private Caller
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop
打開瀏覽器,連上網址 http://localhost:3000/
,你應該可以看到這個畫面:
說明:隨著 Ruby 跟 Rails 的版本不同,可能會看到不同的畫面。
恭喜你,你已經順利把 Ruby 跟 Rails 安裝完成,而且建立了一個全新的 Rails 專案並順利跑起來了。雖然環境安裝看起來只是一小步,但這一小步對第一次接觸終端機、要打一堆指令的人來說已經是不小的一步了。
為什麼是 bin/rails server
而不是 rails server
就好?
有些網路上的資料或參考書籍,在啟動 Rails 的伺服器只要輸入 rails server
指令就好,但為什麼上面這裡是用 bin/rails server
?
因為 Ruby 的各種套件可能會有各種不同的版本,雖然已經使用 Bundler 在做套件管理,但有時候要在 Rails 專案中正確載入與 Gemfile 一樣的版本設定,有時會需要執行這樣的指令:
$ bundle exec rails db:migrate
但如果每次都要輸入這麼長的指令其實有點麻煩,所以 Rails 在專案的 bin
目錄裡幫我們先預先包裝了好幾個檔案,稱之 binstub
。這些 binstub 的功用可以讓你在執行 bin/rails db:migrate
指令的時候,就等同於執行 bundle exec rails db:migrate
指令。
讓我們打開 bin/rails
檔案看一下裡面是怎麼回事:
#!/usr/bin/env ruby
begin
load File.expand_path('../spring', __FILE__)
rescue LoadError => e
raise unless e.message.include?('spring')
end
APP_PATH = File.expand_path('../config/application', __dir__)
require_relative '../config/boot'
require 'rails/commands'
有的可能現在大家看不太懂,但其中倒數第 2 行的 require_relative '../config/boot'
,這行會讀取專案裡的 Gemfile 並依該檔案內容設定載入適當版本的 Gem。
在大部份情況下即使不使用 binstub 也是可以正確執行,但本書將採用 binstub 方式撰寫指令,實際操作時可視情況省略 bin/
路徑。
Comments