建立 Rails 新專案時 (以 5.2.3 為例),接著開啟專案中「Gemfile」檔案:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
ruby '2.6.3'
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 5.2.3'
# Use sqlite3 as the database for Active Record
gem 'sqlite3'
# Use Puma as the app server
gem 'puma', '~> 3.11'
# Use SCSS for stylesheets
gem 'sass-rails', '~> 5.0'
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'
# See https://github.com/rails/execjs#readme for more supported runtimes
# gem 'mini_racer', platforms: :ruby
# Use CoffeeScript for .coffee assets and views
gem 'coffee-rails', '~> 4.2'
# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks
gem 'turbolinks', '~> 5'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.5'
# Use Redis adapter to run Action Cable in production
# gem 'redis', '~> 4.0'
# Use ActiveModel has_secure_password
# gem 'bcrypt', '~> 3.1.7'
# Use ActiveStorage variant
# gem 'mini_magick', '~> 4.8'
# Use Capistrano for deployment
# gem 'capistrano-rails', group: :development
# Reduces boot times through caching; required in config/boot.rb
gem 'bootsnap', '>= 1.1.0', require: false
group :development, :test do
# Call 'byebug' anywhere in the code to stop execution and get a debugger console
gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
end
group :development do
# Access an interactive console on exception pages or by calling 'console' anywhere in the code.
gem 'web-console', '>= 3.3.0'
gem 'listen', '>= 3.0.5', '< 3.2'
# Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
gem 'spring'
gem 'spring-watcher-listen', '~> 2.0.0'
end
group :test do
# Adds support for Capybara system testing and selenium driver
gem 'capybara', '>= 2.15'
gem 'selenium-webdriver'
# Easy installation and use of chromedriver to run system tests with Chrome
gem 'chromedriver-helper'
end
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
會發現第 1–2 行寫著如下:
1
2source ‘https://rubygems.org'
git_source(:github) { |repo| “https://github.com/#{repo}.git" }
Gemfile 需要至少一個 gem 來源,以 RubyGems 伺服器 URL 格式來說,透過執行產生具有預設 rubygems.org 的 Gemfile bundle init
,請使用https
以便使用 SSL 驗證與 rubygems.org 的連結。
往下看,發現下面程式碼起手式大部分為 gem
和 group
開頭:
先從 gem
開頭介紹每個版本的涵義:
沒寫版本:
1
2gem ‘sqlite3’
gem ‘spring’
安裝時選用「最新的穩定版本」,重點在「穩定」而非「最新」。
有寫版本:
ruby '2.6.3'
如看到所說,「我要安裝 Ruby 2.6.3 版本」。
大於等於、小於:
1
gem ‘uglifier’, ‘>= 1.3.0’
安裝大於等於 1.3.0 版本。
1
gem ‘listen’, ‘>= 3.0.5’, ‘< 3.2’
安裝大於等於 3.0.5 及小於 3.2 的版本。
差不多
1
gem ‘rails’, ‘~> 5.2.3’
安裝 5.2.3 以上,但 5.3 以下(不含 5.3)的最新版本。
放在 group 中:
1
2
3group :development, :test do
(略)
end
只在開發(:development)、測試(:test)環境中能使用,像是 spring (可看上篇文章),網站上線時不需讓使用者看到、用到,就會寫在這裡面。
只想單獨讓開發(:development)或測試(:test)使用,可各別寫在對應的 group 內喔。
說到 Gemfile 一定要介紹下 RubyGems,上面提供許多好用的 Gem 套件可供使用,像是bootstrap、faker、simple_form、devise、hirb-unicode、rspec-rails、factory_bot_rails…等,使用前記得先翻閱文件,會更清楚如何使用
如何新增 gem 呢? RubyGems 搜尋需要的 gem 並加入 Gemfile 中,接著再終端機輸入
1
2
3bundle install
或
bundle
就能使用囉~ (有些 gem 要將 server 重啟喔,記得看文件(很重要講三次))
打開看 Gemfile.lock 檔案,會發現目前所有套件的快照檔已被存下來
未來 bundle 時,會根據快照檔 Gemfile.lock 決定 Gemfile 是否有修改來進行套件更新
為什麼要這麼麻煩?
不如說這是貼心的代價,以版本 5.2.3 為例,5、2、3 三個數字分別代表主要版號(Major)、次要版號(Minor)、修訂版號(Path),表示如下:
- 主要版號:功能大改,公開的 API 做了不少修正,不一定能向下相容。
- 次要版號:加入某些新功能,但不影響其它功能,能向下相容。
- 修訂版號:對現有的功能做小幅度修正,可向下相容。
若沒有版本控制,每次都安裝最新版,導致舊版或某些 API 不相容或產生衝突時,通往「相依性地獄」的死亡之谷將給你滿滿地絕望…
參考: