class Gem::RequestSet::GemDependencyAPI
Bundler Gemfile 和 Isolate gem 依赖文件的半兼容 DSL。
为了同时支持 Bundler Gemfile 和 Isolate 格式,此实现会进行一些自由发挥以兼容两者,尤其是在 source 方法中。
基本的 gem 依赖文件将如下所示:
source 'https://rubygems.org.cn' gem 'rails', '3.2.14a gem 'devise', '~> 2.1', '>= 2.1.3' gem 'cancan' gem 'airbrake' gem 'pg'
RubyGems 建议将此文件保存为 gem.deps.rb,而不是 Gemfile 或 Isolate。
要安装此 Gemfile 中的 gem,请使用 'gem install -g' 进行安装并创建锁定文件。锁定文件将确保当您更改 gem 依赖文件时,对 gem 依赖项的更改量最小。
RubyGems 可以通过 RUBYGEMS_GEMDEPS 环境变量或通过 Gem.use_gemdeps 在启动时激活您依赖文件中的所有 gem。有关详细信息和警告,请参阅 Gem.use_gemdeps。
有关更多详细信息,请参阅 'gem help install' 和 'gem help gem_dependencies'。
属性
gem.deps.rb 文件中的 gem 语句所要求的 gem
一个包含 gem 名称和从这些 gem 中加载文件的 Hash。
Public Class Methods
Source
# File lib/rubygems/request_set/gem_dependency_api.rb, line 197 def initialize(set, path) @set = set @path = path @current_groups = nil @current_platforms = nil @current_repository = nil @dependencies = {} @default_sources = true @git_set = @set.git_set @git_sources = {} @installing = false @requires = Hash.new {|h, name| h[name] = [] } @vendor_set = @set.vendor_set @source_set = @set.source_set @gem_sources = {} @without_groups = [] git_source :github do |repo_name| repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include? "/" "https://github.com/#{repo_name}.git" end git_source :bitbucket do |repo_name| repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include? "/" user, = repo_name.split "/", 2 "https://#{user}@bitbucket.org/#{repo_name}.git" end end
创建一个新的 GemDependencyAPI,它将基于 path 中的依赖 API 描述将依赖项添加到 Gem::RequestSet set 中。
Public Instance Methods
Source
# File lib/rubygems/request_set/gem_dependency_api.rb, line 605 def git_source(name, &callback) @git_sources[name] = callback end
定义一个自定义 git 源,它使用 name 来扩展用于从 git 仓库构建的 gem 的 git 仓库。您必须提供一个块,该块接受一个 git 仓库名称进行扩展。
Source
# File lib/rubygems/request_set/gem_dependency_api.rb, line 282 def load instance_eval File.read(@path), @path, 1 self end
加载 gem 依赖文件并返回自身。
私有实例方法
Source
# File lib/rubygems/request_set/gem_dependency_api.rb, line 695 def pin_gem_source(name, type = :default, source = nil) source_description = case type when :default then "(default)" when :path then "path: #{source}" when :git then "git: #{source}" when :source then "source: #{source}" else "(unknown)" end raise ArgumentError, "duplicate source #{source_description} for gem #{name}" if @gem_sources.fetch(name, source) != source @gem_sources[name] = source end
将 gem name 固定到给定的 source。添加来自不同 source 的同名 gem 将引发异常。
Gem 依赖 DSL
Public Instance Methods
Source
# File lib/rubygems/request_set/gem_dependency_api.rb, line 359 def gem(name, *requirements) options = requirements.pop if requirements.last.is_a?(Hash) options ||= {} options[:git] = @current_repository if @current_repository source_set = false source_set ||= gem_path name, options source_set ||= gem_git name, options source_set ||= gem_git_source name, options source_set ||= gem_source name, options duplicate = @dependencies.include? name @dependencies[name] = if requirements.empty? && !source_set Gem::Requirement.default elsif source_set Gem::Requirement.source_set else Gem::Requirement.create requirements end return unless gem_platforms name, options groups = gem_group name, options return unless (groups & @without_groups).empty? pin_gem_source name, :default unless source_set gem_requires name, options if duplicate warn <<-WARNING Gem dependencies file #{@path} requires #{name} more than once. WARNING end @set.gem name, *requirements end
指定具有给定 name 和 requirements 的 gem 依赖项。您还可以在 requirements 之后提供 options。
options 包括:
- require
-
RubyGems 不提供任何自动加载功能,因此 gem 依赖文件中的 requires 会被记录但被忽略。
在 bundler 中,require: 选项会在
Bundler.require期间覆盖要加载的文件。默认情况下,在Bundler中加载依赖项的名称。可以指定单个文件或文件Array。要禁用加载任何文件,请提供
false。gem 'rake', require: false
- group
-
将依赖项放入给定的依赖项组中。可以指定单个组或组
Array。另请参阅
group。 - platform
-
仅在给定的平台上安装此依赖项。可以指定单个平台或平台
Array。有关可用平台列表,请参阅
platform。 - path
-
从此目录下的已解压 gem 安装此依赖项。
gem 'modified_gem', path: 'vendor/modified_gem'
- git
-
从 git 仓库安装此依赖项。
gem 'private_gem', git: 'git@my.company.example:private_gem.git'
- gist
-
从 gist ID 安装此依赖项。
gem 'bang', gist: '1232884'
- github
-
从 github git 仓库安装此依赖项。
gem 'private_gem', github: 'my_company/private_gem'
- submodules
-
设置为
true以在为 git:、gist: 和 github: 依赖项获取 git 仓库时包含子模块。 - ref
-
使用给定的提交名称或 SHA 来处理 git:、gist: 和 github: 依赖项。
- branch
-
使用给定的分支来处理 git:、gist: 和 github: 依赖项。
- tag
-
使用给定的标签来处理 git:、gist: 和 github: 依赖项。
Source
# File lib/rubygems/request_set/gem_dependency_api.rb, line 638 def gemspec(options = {}) name = options.delete(:name) || "{,*}" path = options.delete(:path) || "." development_group = options.delete(:development_group) || :development spec = find_gemspec name, path groups = gem_group spec.name, {} self_dep = Gem::Dependency.new spec.name, spec.version add_dependencies groups, [self_dep] add_dependencies groups, spec.runtime_dependencies @dependencies[spec.name] = Gem::Requirement.source_set spec.dependencies.each do |dep| @dependencies[dep.name] = dep.requirement end groups << development_group add_dependencies groups, spec.development_dependencies @vendor_set.add_vendor_gem spec.name, path gem_requires spec.name, options end
从 gemspec 文件加载依赖项。
options 包括:
- name
-
gemspec 文件的名称部分。默认为搜索当前目录中的任何 gemspec 文件。
gemspec name: 'my_gem'
- path
-
gemspec 所在的路径。默认为当前目录。
gemspec 'my_gem', path: 'gemspecs', name: 'my_gem'
- development_group
-
将开发依赖项添加到此组。默认值为 :development。只能指定一个组。
Source
# File lib/rubygems/request_set/gem_dependency_api.rb, line 592 def git(repository) @current_repository = repository yield ensure @current_repository = nil end
指定来自 git repository 的 gem 的块形式。
git 'https://github.com/rails/rails.git' do gem 'activesupport' gem 'activerecord' end
Source
# File lib/rubygems/request_set/gem_dependency_api.rb, line 683 def group(*groups) @current_groups = groups yield ensure @current_groups = nil end
将依赖项放置在给定 groups 中的块形式。
group :development do gem 'debugger' end group :development, :test do gem 'minitest' end
可以使用 'gem install -g –without development' 在安装时排除组。有关详细信息,请参阅 'gem help install' 和 'gem help gem_dependencies'。
Source
# File lib/rubygems/request_set/gem_dependency_api.rb, line 757 def platform(*platforms) @current_platforms = platforms yield ensure @current_platforms = nil end
将 gem 限制在一组平台上的块形式。
gem 依赖项平台与 Gem::Platform 不同。平台 gem.deps.rb 平台匹配 ruby 引擎、ruby 版本以及是否允许 windows。
- :ruby, :ruby_XY
-
匹配非 Windows、非 JRuby 实现,其中 X 和 Y 可用于匹配 1.8、1.9、2.0 或 2.1 系列的版本。
- :mri, :mri_XY
-
匹配非 Windows C Ruby (Matz Ruby) 或仅匹配 1.8、1.9、2.0 或 2.1 系列。
- :mingw, :mingw_XY
-
匹配 MinGW 上的 32 位 C Ruby 或仅匹配 1.8、1.9、2.0 或 2.1 系列。
- :x64_mingw, :x64_mingw_XY
-
匹配 MinGW 上的 64 位 C Ruby 或仅匹配 1.8、1.9、2.0 或 2.1 系列。
- :mswin, :mswin_XY
-
匹配 Microsoft Windows 上的 32 位 C Ruby 或仅匹配 1.8、1.9、2.0 或 2.1 系列。
- :mswin64, :mswin64_XY
-
匹配 Microsoft Windows 上的 64 位 C Ruby 或仅匹配 1.8、1.9、2.0 或 2.1 系列。
- :jruby, :jruby_XY
-
匹配 JRuby 或 JRuby 的 1.8 或 1.9 模式。
- :maglev
-
匹配 Maglev。
- :rbx
-
匹配非 Windows Rubinius。
注意:平台匹配的环境存在不一致。您可能需要阅读源代码以了解确切的详细信息。
Source
# File lib/rubygems/request_set/gem_dependency_api.rb, line 783 def ruby(version, options = {}) engine = options[:engine] engine_version = options[:engine_version] raise ArgumentError, "You must specify engine_version along with the Ruby engine" if engine && !engine_version return true if @installing unless version == RUBY_VERSION message = "Your Ruby version is #{RUBY_VERSION}, " \ "but your #{gem_deps_file} requires #{version}" raise Gem::RubyVersionMismatch, message end if engine && engine != Gem.ruby_engine message = "Your Ruby engine is #{Gem.ruby_engine}, " \ "but your #{gem_deps_file} requires #{engine}" raise Gem::RubyVersionMismatch, message end if engine_version if engine_version != RUBY_ENGINE_VERSION message = "Your Ruby engine version is #{Gem.ruby_engine} #{RUBY_ENGINE_VERSION}, " \ "but your #{gem_deps_file} requires #{engine} #{engine_version}" raise Gem::RubyVersionMismatch, message end end true end
将此 gem 依赖文件限制为给定的 ruby version。
您还可以提供 engine: 和 engine_version: 选项来将此 gem 依赖文件限制为特定的 ruby 引擎及其引擎版本。此匹配是通过使用 RUBY_ENGINE 和 RUBY_ENGINE_VERSION 常量执行的。
Source
# File lib/rubygems/request_set/gem_dependency_api.rb, line 834 def source(url) Gem.sources.clear if @default_sources @default_sources = false Gem.sources << url end
将 url 设置为此依赖 API 的 gem 源。如果未提供源,RubyGems 将使用默认配置的源。如果设置了源,则仅使用该源。
此方法与 Bundler 的行为不同。
-
:gemcutter、#:rubygems和:rubyforge源不受支持,因为它们在 bundler 中已弃用。 -
不支持
prepend:选项。如果您希望对源进行排序,请按首选顺序列出它们。