定义
Gemfile - 一个为了Ruby程序描述gem依赖的文件格式
概要
Gemfile里面描述了需要运行相关Ruby代码的gem依赖,一般是将此文件放到根目录。 例如Rails程序,是放在Rakefile的同一个目录下面。
语法
Gemfile相当于Ruby代码,并且有一些用于gem依赖的方法。
全局的Sources
一般写在Gemfile的头部,指定Gem的源地址,例如:
1 2 3 4 |
|
一般情况下,不太建议指定多个source。如果一个gem在多个source里存在,bundler会打印一些警告出来。 如果单个gem使用不一样的source,建议使用:source选项或者source block(后面会详细介绍)。
认证
有些gem的source需要用户密码才能使用,可以通过使用bundle config命令或者直接写在source的地址里面 2种方式。
1
|
|
直接写在source的地址里面
1
|
|
如果2种方式都设定了的话,下面一种方式的优先级高于bundle config。
Ruby
如果你的应用需要指定一个特定的Ruby版本或者engine。
VERSION(必须指定)
你的应用需要的Ruby版本。如果你的应用使用了另外一个engine如JRuby或者Rubinius,得需要和这个版本保持兼容。
1
|
|
ENGINE (:engine)
应用可以指定的Ruby Engine(如JRuby或者Rubinius)。如果engine指定了的话,对应的enine版本同样也必须指定。
ENGINE VERSION (:engine_version)
Ruby Engine的版本。这个必须与engine成对出现。
1
|
|
PATCHLEVEL (:patchlevel)
指定Ruby对应版本的patchlevel。
1
|
|
GEMS (#gem)
指定gem的方法,有下面的参数。
NAME (必须指定)
gem的名字
1
|
|
VERSION
gem的版本
1 2 |
|
指定版本有好几种方式:
- 固定版本
1
|
|
- 大于等于某个版本
1
|
|
- 在指定版本范围内
1
|
|
- 约等于某个版本
1
|
|
~>
这个的版本有特别的意思:~> 2.0.3
表示版本在>= 2.0.3
和< 2.1
之间。
~> 2.1
表示版本在>= 2.1
和< 3.0
之间。
~> 2.2.beta
会匹配这个版本2.2.beta.12
。
REQUIRE AS (:require)
用来指定require指定文件或者指定为false使应用不会自动require。
1 2 3 |
|
- true 指应用自动require该gem。在使用该gem的地方无需自己手动require了。
- false 应用不会自动require该gem。在使用该gem的地方需自己手动require。
- 单个文件名或文件数组。一般gem的主文件名和gem名不一致的时候,需要在这里指定成文件名。
所以下面3个的requires其实是一样的。
1 2 3 |
|
GROUPS (:group or :groups)
每个gem可以指定在任何的一个或者多个group里面。如果gem没有指定group的话,默认是在default group里。
1 2 |
|
bundler有2个主要的方法Bundler.setup和Bundler.require可以访问group。
1 2 3 4 5 6 7 8 9 10 11 12 |
|
bundle install可以指定--without
的参数来忽略某些group的gem的安装。
1 2 |
|
如果你运行完bundle install --without test
以后,bundle会记住你最后一次忽略test group的配置。
下次你如果直接运行bundle install
,默认就会带--without test
配置来安装gem。
并且如果调用bundler.setup没有传入参数,将会加载所有除了设定的--without
group的gem。
另外运行bundle install将会下载所有的gem及其依赖的gem并且建立一个gem列表,这就意味着你不能在不同的group 加载不同版本的相同gem。
PLATFORMS (:platforms)
指定某个gem只能运行的平台。
有很多的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 |
|
和group差不多,你可以指定一个或多个。
1 2 3 |
|
SOURCE (:source)
如果某个gem需要单独从另外的source去下载,可以通过指定这个参数实现。
1
|
|
如果找不到,将会去global source那里去找。
GIT (:git)
你可以指定一个gem是从指定的git repo那里下载。这个repo可以是公开的 (http://github.com/rails/rails.git)也可以是私有(git@github.com:rails/rails.git) 的,如果是私有必须保证你的ssh配置有权限clone该repo。
1
|
|
这个repo必须至少有一个文件在项目的根目录下,后缀名是.gemspec
,这个文件里面包含的是
各个gem指定的信息。
如果这个repo没有.gemspec
文件,bundler将会试着新建一个空的文件。
如果repo里面有.gemspec
文件,那必须保证该文件里面的版本和gem指定的版本要一致。
不一致的话,bundle会有警告。
1 2 3 |
|
如果.gemspec
文件没有的话,gem的版本必须指定,bundle将会根据这个版本新建.gemspec
文件。
git这个参数还有额外的参数:
- branch, tag, 和 ref。 你只能指定其中一个参数。默认使用的是
:branch => "master"
。 - submodules。 如果指定:submodules => true的话,bundle会默认扩展这个repo里面的submodule。
GITHUB (:github)
如果git repo是github的公开项目的话你只需指定用户名项目名即可。如果项目名和用户名一样,那只需指定其中一个即可。
1 2 |
|
和下面这个是一样的。
1
|
|
也是可以指定分支的:
1
|
|
PATH (:path)
你可以指定某个目录下的gem,基本是和git参数一样,也是需要项目里有.gemspec
文件。
但需要注意的是与git不一样的是:bundle不会编译path方式指定的gem里面的c扩展。
1
|
|
SOURCE, GIT, PATH, GROUP 和 PLATFORMS 的block
就是把source,git,path,group和platform可以通过block分组设置了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
需要的注意的是git,设置了branch等参数的话,里面所有的gem都是会继承的。
GEMSPEC (#gemspec)
用来指定查找gem里面的gemspec文件。 gemspec有:path, :name和:development_group参数,这些参数用来查找gemspec文件的。
SOURCE 优先级
bundle使用如下的source优先级:
- gem本身自己定义的:source, :path, 或者 :git参数
- 对于依赖的一些gem, :source, :path, 或者 :git里面对应的版本优先级高于rubygems.org
- 对于多个全局SOURCE的情况,将会是从最后加入的一个source开始搜索优先级最高。