class Gem::RequestSet::GemDependencyAPI
一个半兼容的 DSL,用于 Bundler
Gemfile 和 Isolate gem 依赖文件。
为了同时兼容 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
语句在 gem.deps.rb 文件中要求的 gem
包含 gem 名称和从这些 gem 中需要的文件 的 Hash
。
公共类方法
源
# 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
。
公共实例方法
源
# File lib/rubygems/request_set/gem_dependency_api.rb, line 605 def git_source(name, &callback) @git_sources[name] = callback end
定义一个自定义 git 源,该源使用 name
来扩展 git 存储库,以用于从 git 存储库构建的 gem。您必须提供一个块,该块接受 git 存储库名称以进行扩展。
源
# File lib/rubygems/request_set/gem_dependency_api.rb, line 282 def load instance_eval File.read(@path), @path, 1 self end
加载 gem 依赖文件并返回 self。
私有实例方法
源
# 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
↑ 顶部公共实例方法
源
# 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 不提供任何自动 require 功能,因此在 gem 依赖文件中记录 require 但会被忽略。
在 bundler 中,require: 选项会覆盖在
Bundler.require
期间要 require 的文件。默认情况下,Bundler
中需要依赖项的名称。可以给出一个文件或一个Array
的文件。要禁用 require 任何文件,请提供
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
-
当为 git:、gist: 和 github: 依赖项获取 git 存储库时,将
Set
设置为true
以包括子模块。 - ref
-
为 git:、gist: 和 github: 依赖项使用给定的提交名称或 SHA。
- branch
-
为 git:、gist: 和 github: 依赖项使用给定的分支。
- tag
-
为 git:、gist: 和 github: 依赖项使用给定的标签。
源
# 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。只能指定一个组。
源
# 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
源
# 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`。
源
# 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 或 1.8 或 1.9 模式的 JRuby。
- :maglev
-
匹配 Maglev
- :rbx
-
匹配非 windows Rubinius
注意:平台匹配的环境不一致。您可能需要阅读源代码才能了解确切的详细信息。
源
# 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 常量执行的。
源
# 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:
选项。如果您希望对源进行排序,请按您的首选顺序列出它们。