你必須很努力

Rails 中的 Gemfile 檔案的內容

2019/09/15
字數統計: 1.2k閱讀時間: 5 min

建立 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
62
source '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
2
source ‘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 的連結。


往下看,發現下面程式碼起手式大部分為 gemgroup 開頭: 先從 gem 開頭介紹每個版本的涵義:

沒寫版本:

1
2
gem ‘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
3
group :development, :test do
(略)
end

只在開發(:development)、測試(:test)環境中能使用,像是 spring (可看上篇文章),網站上線時不需讓使用者看到、用到,就會寫在這裡面。

只想單獨讓開發(:development)或測試(:test)使用,可各別寫在對應的 group 內喔。


說到 Gemfile 一定要介紹下 RubyGems,上面提供許多好用的 Gem 套件可供使用,像是bootstrapfakersimple_formdevisehirb-unicoderspec-railsfactory_bot_rails…等,使用前記得先翻閱文件,會更清楚如何使用


如何新增 gem 呢? RubyGems 搜尋需要的 gem 並加入 Gemfile 中,接著再終端機輸入

1
2
3
bundle install

bundle

就能使用囉~ (有些 gem 要將 server 重啟喔,記得看文件(很重要講三次))

打開看 Gemfile.lock 檔案,會發現目前所有套件的快照檔已被存下來
未來 bundle 時,會根據快照檔 Gemfile.lock 決定 Gemfile 是否有修改來進行套件更新

為什麼要這麼麻煩?

不如說這是貼心的代價,以版本 5.2.3 為例,5、2、3 三個數字分別代表主要版號(Major)、次要版號(Minor)、修訂版號(Path),表示如下:

  • 主要版號:功能大改,公開的 API 做了不少修正,不一定能向下相容。
  • 次要版號:加入某些新功能,但不影響其它功能,能向下相容。
  • 修訂版號:對現有的功能做小幅度修正,可向下相容。

若沒有版本控制,每次都安裝最新版,導致舊版或某些 API 不相容或產生衝突時,通往「相依性地獄」的死亡之谷將給你滿滿地絕望…


參考:

  1. Ruby 語法放大鏡之「在 Gemfile 裡看到版本寫法有好幾款,各是代表什麼意思?」
  2. [筆記]Ruby 的 RVM,GEM,Bundler 是什麼?
  3. [使用套件(Gem)讓開發更有效率]
  4. Bundler
  5. [語意化版本 2.0.0]

原文連結:https://riverye.com/2019/09/15/Rails-中的-Gemfile-檔案的內容/

發表日期:2019-09-15

更新日期:2022-12-21

CATALOG
  1. 1. 為什麼要這麼麻煩?
    1. 1.1. 若沒有版本控制,每次都安裝最新版,導致舊版或某些 API 不相容或產生衝突時,通往「相依性地獄」的死亡之谷將給你滿滿地絕望…