5.2与Bundler息息相关的Gemfile的讲解

Gemfile– 一种描述Ruby程序的gem依赖关系的格式文件。

1.Global Sources(全局源)

source "https://rubygems.org"    #声明全局获取gem的源服务器地址

2.Ruby版本(必填)

您的应用程序需要的Ruby版本。

ruby "1.9.3"

3.Gem行

如果声明了gem行,名称必须填写,否则不要声明。

gem 'nokogiri'            
gem 'rails', '5.0.0'
gem 'rack',  '>=1.0'
gem 'thin',  '~>1.1'

大多数版本说明符(例如>= 1.0)都是不言自明的。该说明符~>具有特殊含义,最好以示例形式显示。 ~> 2.0.3>= 2.0.3< 2.1相同。 ~> 2.1>= 2.1< 3.0相同。 ~> 2.2.beta将与预发行版本匹配2.2.beta.12。 ~> 0>= 0.0< 1.0相同。

4.Groups(分组)

有时您会遇到几组只在特定环境中才有意义的gem。例如,您可以使用SQLite(在早期阶段)开发应用程序,但可以使用mysql2pg来部署它。在此示例中,您的开发计算机上可能未安装MySQL或Postgres,并且希望bundler程序跳过它。为此,您可以对依赖项进行分组:

source 'https://rubygems.org'

gem 'rails', '3.2.2'
gem 'rack-cache', require: 'rack/cache'
gem 'nokogiri', '~> 1.4.2'

group :development do
  gem 'sqlite3'
end

group :production do
  gem 'pg'
end

现在,在开发中,您可以指示bundler程序跳过该production组:

$ bundle install --without production

Bundler会记得您使用安装了gems --without production。对于好奇的读者,bundler程序将标记存储在 APP_ROOT/.bundle/config中。您可以通过运行查看bundler程序在其中保存的所有设置,这些设置bundle config还将打印出全局设置(存储在中~/.bundle/config)和通过环境变量设置的设置。

如果bundle install稍后运行时没有任何标志,bundler程序将记住您上次调用的位置,bundle install --without production并再次使用该标志。当您使用时require 'bundler/setup',捆绑软件将忽略这些组中的gem。

5.Platforms(平台)

如果gem仅应在特定平台或一组平台中使用,则可以指定它们。平台本质上与组相同,不同之处在于,您不需要使用--withoutinstall-time标志来排除其他平台上的gem组。

有许多Gemfile平台:

ruby C Ruby(MRI)Rubinius或TruffleRuby,但不是Windows

mriruby相同,但仅CRuby(MRI)

mingw Windows 32位’mingw32’平台(aka RubyInstaller)

x64_mingw Windows 64位’mingw32’平台(aka RubyInstaller x64)

rbx Rubinius

jruby JRuby

truffleruby TruffleRuby

mswin Windows

您还可以通过平台和版本适用于所有平台限制,除了为 rbxjrubytrufflerubymswin

要指定平台以外的版本,请在平台上附加不带分隔符的版本号。例如,要指定gem只应在具有Ruby 2.3的平台上使用,请使用:

ruby_23

平台和支持的版本的完整列表包括:

ruby 1.8、1.9、2.0、2.1、2.2、2.3、2.4、2.5、2.6

mri 1.8、1.9、2.0、2.1、2.2、2.3、2.4、2.5、2.6

mingw 1.8、1.9、2.0、2.1、2.2、2.3、2.4、2.5、2.6

x64_mingw 2.0、2.1、2.2、2.3、2.4、2.5、2.6

与组一样,您可以指定一个或多个平台:

gem "weakling",   :platforms => :jruby
gem "ruby-debug", :platforms => :mri_18
gem "nokogiri",   :platforms => [:mri_18, :jruby]

所有涉及组操作(bundle installBundler.setup, Bundler.require)的行为完全一样的,如果不符合当前平台的任何组分别明确排除。

6.Source(专有源)

您可以使用’:source’选项为gem选择备用的Rubygems存储库。

gem "some_internal_gem", :source => "https://gems.example.com"

这将强制从此源加载gem,并忽略在文件顶层声明的所有全局源。如果该源文件中不存在gem,则将不会安装它。

7.Git源

可以通过git_source方法定义自定义git源。提供源名称作为参数,并提供一个接收单个参数并将其内插到字符串中以返回完整仓库地址的块:

git_source(:stash){ |repo_name| "https://stash.corp.acme.pl/#{repo_name}.git" }
gem 'rails', :stash => 'forks/rails'

另外,如果您想选择一个特定的分支:

gem "rails", :stash => "forks/rails", :branch => "branch_name"

8.源优先级

Bundler程序使用以下源优先级顺序:

  1. 所述gem的专有源(使用:source:path或 :git
  2. 对于隐式gem(显式gem的依赖项),在父级上声明的任何源,git或路径存储库。这导致bundler处理来自Rails git存储库的ActiveSupport gem优先于来自 rubygems.org
  3. 通过global source行指定的源,Gemfile搜索您的每个来源。

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/ruby/rubybasic/1827.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注