企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# bundler bundler主要用于管理Ruby应用程序的依赖关系,并按照此依赖关系安装所需的Gems。 安装bundler: ~~~ gem install bundler ~~~ 当运行bundle install命令来安装Gems时,bundler会使用当前目录下的名为Gemfile的文件来处理依赖关系。 Gemfile 是 Bundler 引入的一種檔案,可以在 Gemfile 裡面聲明會用到的 RubyGems。 ### 簡單的 Gemfile 可以在隨意目錄下,使用 bundle init 來建立一個 Gemfile: ~~~ # A sample Gemfile source "https://rubygems.org" # gem "rails" ~~~ ### Gem 来源 Gemfile 需要指定一個 Gem 來源站點,Bundler 才知道要去那裡幫你把 RubyGems 抓回來。 ~~~ source "https://rubygems.org" ~~~ 使用 http 也可以,https 比較安全。 可以宣告多個來源: ~~~ source "https://rubygems.org" source "https://ruby.taobao.org" ~~~ 上面的優先。 ### Gem 撰寫方式 最簡單的便是: ~~~ gem "rails" ~~~ 另可指定版本、require 方式、所屬的 group 等其他選項。 ### 指定 RubyGems 的版本 指定版本的方法與 Rubygems 版本規範相同。舉幾個例子: ~~~ gem "nokogiri" gem "rails", "4.1.1" gem "rack", "~> 1.5" gem "kaminari", "~> 0.15.1" gem "uglifier", ">= 1.3" gem "sinatra", "~> 1" ~~~ 這裡看到 4 種版本指定方式: 1. 不指定版本 ~~~ gem "nokogiri" ~~~ 盡可能使用最新版。 1. 明確指定版本 ~~~ gem "rails", "4.1.1" ~~~ 指定使用 Rails 4.1.1。 1. ~> ~~~ gem "rack", "~> 1.5" ~~~ 會使用介於 1.5 ~ 2.0 的最新版(不包含 2.0)。 ~~~ gem "kaminari", "~> 0.15.1" ~~~ 會使用介於 0.15.1 ~ 0.16.0 的最新版(不包含 0.16.0) ~~~ gem "sinatra", "~> 1" ~~~ 會使用介於 1.0 ~ 2.0 的最新版(不包含 2.0) 1. >= ~~~ gem "uglifier", ">= 1.3" ~~~ 會使用 1.3 以上(包含 1.3)的最新版本。 ### 版本指定方式總結 这些版本号都是语义化版本,可以自己搜索相关概念。 ~~~ 指定方式 起始 ~ 結束(不包含) ">= 3.0" 3.0 ... ∞ "~> 3.0" 3.0 ... 4.0 "~> 3.0.0" 3.0.0 ... 3.1 "~> 3.5" 3.5 ... 4.0 "~> 3.5.0" 3.5.0 ... 3.6 "~> 3" 3.0 ... 4.0 ~~~ 來源:[https://github.com/rubygems/rubygems/blob/master/lib/rubygems/version.rb](https://github.com/rubygems/rubygems/blob/master/lib/rubygems/version.rb) ### RubyGems require 方式 一般在有使用 Bundler 的專案裡,會有個檔案,裡面有如下程式碼(以 Rails 為例): ~~~ require 'bundler/setup' Bundler.require(:default, Rails.env) ~~~ 告訴 Bundler 自動幫你 require RubyGems。 但有些 RubyGem 的名稱不符合 Ruby 的命名,或是不想要 Bundler 自動幫我們 require。 Gem 的名稱不同會有不同的 require 語句,以及類別、模組的命名方式,以下是 Rubygem 的命名慣例: | Gem 名稱 | require 語句 | 主要的類別與模組 | |-----|-----|-----| | fancy_require | require "fancy_require" | FancyRequire | | ruby_parser | require "ruby_parser" | RubyParser | | net-http-persistent | require "net/http/persistent" | Net::HTTP::Persistent | | rdoc-data | require "rdoc/data" | RDoc::Data | | autotest-growl | require "autotest/growl" | Autotest::Growl | | net-http-digest_auth | require "net/http/digest_auth" | Net::HTTP::DigestAuth | 命名慣例有幾點要注意的是: - 多個單字使用底線(_)區隔。 - 為某個 Gem 寫的擴充功能請用橫槓 -,比如 rspec-rails 是 rspec 對 Rails 的擴充。 - 正確混用底線與橫槓 -,如:net-http-digest_auth。 - 不要使用全大寫。OSX、Windows 不分大小寫的,很容易出錯。 看一些例子: ~~~ gem "recaptcha", :require => "recaptcha/rails" gem "activeadmin", github: "gregbell/active_admin" ~~~ ### RubyGems 分組管理 使用 :group 選項: ~~~ gem "bullet", :group => "development" ~~~ 多個群組使用 :groups 選項: ~~~ gem "factory_girl_rails", :groups => [:development, :test] ~~~ ### 指定 RubyGems 來源為 Git 可以指定托管在使用 Git 平台上(如 GitHub、Bitbucket、Gitcafe)的 RubyGem。 使用 :git 選項: ~~~ gem "rails", :git => "git://github.com/rails/rails.git" ~~~ ### 指定分支 使用 :branch 指定。 ~~~ gem "rails", :git => "git://github.com/rails/rails.git", branch: "4-1-stable" ~~~ GitHub 由於 GitHub 很流行,所以有一個特別的 :github 選項。 ~~~ gem "rails", github: "rails/rails" ~~~ ### 指定 RubyGems 來源為本機路徑 使用 :path 選項: ### 指定 RubyGems 的平台 根據 Ruby 版本不同,指定不同的 debugger: ~~~ gem debugger, platforms: [:ruby_18, :ruby_19] gem byebug, platforms: [:ruby_20, :ruby_21] ~~~ ### Gemfile 指定 Ruby 使用 2.1.2: ~~~ ruby "2.1.2" ~~~ 使用 2.0.0-p481: ~~~ ruby "2.0.0", patchlevel: "481" ~~~ 使用 JRuby: ~~~ ruby "1.8.7", engine: "jruby", engine_version: "1.6.7" ~~~ 注意 Ruby 的版本要與 JRuby 的 engine_version 相容。 ### berkshelf chef的cookbook管理工具berkshelf,跟bundler的用法几乎雷同了。