class Gem::BasicSpecification
BasicSpecification 是一个抽象类,它实现了 Specification 和 StubSpecification 都使用的通用代码。
属性
此 gemspec 加载的路径。此属性不会持久化。
Public Class Methods
Public Instance Methods
Source
# File lib/rubygems/basic_specification.rb, line 48 def activated? raise NotImplementedError end
当 gem 被激活时为真
Source
# File lib/rubygems/basic_specification.rb, line 57 def base_dir raise NotImplementedError end
返回 gem 基础目录的完整路径。
例如:/usr/local/lib/ruby/gems/1.8
Source
# File lib/rubygems/basic_specification.rb, line 107 def base_dir_priority(gem_path) gem_path.index(base_dir) || gem_path.size end
gem_path 中靠前的 gem 具有优先权
Source
# File lib/rubygems/basic_specification.rb, line 64 def contains_requirable_file?(file) if ignored? if platform == Gem::Platform::RUBY || Gem::Platform.local === platform warn "Ignoring #{full_name} because its extensions are not built. " \ "Try: gem pristine #{name} --version #{version}" end return false end is_soext = file.end_with?(".so", ".o") if is_soext have_file? file.delete_suffix(File.extname(file)), Gem.dynamic_library_suffixes else have_file? file, Gem.suffixes end end
如果此 spec 可以 require file,则返回 true。
Source
# File lib/rubygems/basic_specification.rb, line 188 def datadir # TODO: drop the extra ", gem_name" which is uselessly redundant File.expand_path(File.join(gems_dir, full_name, "data", name)) end
此 gem 的数据目录的路径。
Source
# File lib/rubygems/basic_specification.rb, line 92 def default_gem? !loaded_from.nil? && File.dirname(loaded_from) == Gem.default_specifications_dir end
Source
# File lib/rubygems/basic_specification.rb, line 100 def default_gem_priority default_gem? ? 1 : -1 end
常规 gem 优先于默认 gem
Source
# File lib/rubygems/basic_specification.rb, line 114 def extension_dir @extension_dir ||= File.expand_path(File.join(extensions_dir, full_name)) end
返回 gem 扩展安装目录的完整路径。
Source
# File lib/rubygems/basic_specification.rb, line 121 def extensions_dir Gem.default_ext_dir_for(base_dir) || File.join(base_dir, "extensions", Gem::Platform.local.to_s, Gem.extension_api_version) end
返回扩展目录的路径。
Source
# File lib/rubygems/basic_specification.rb, line 138 def full_gem_path @full_gem_path ||= find_full_gem_path end
gem 的完整路径(安装路径 + 完整名称)。
TODO:这与 gem_dir 重复。最终两者之一应该被弃用。
Source
# File lib/rubygems/basic_specification.rb, line 147 def full_name if platform == Gem::Platform::RUBY || platform.nil? "#{name}-#{version}" else "#{name}-#{version}-#{platform}" end end
返回此 Gem 的完整名称(名称-版本)。如果指定了平台信息且不是默认的 Ruby 平台,则包含平台信息(名称-版本-平台)。
Source
# File lib/rubygems/basic_specification.rb, line 160 def full_name_with_location if base_dir != Gem.dir "#{full_name} in #{base_dir}" else full_name end end
返回此 Gem 的完整名称(参见 ‘Gem::BasicSpecification#full_name`)。如果 gem 未安装在默认 GEM_HOME 中,还包括 gem 安装位置的信息。
Source
# File lib/rubygems/basic_specification.rb, line 172 def full_require_paths @full_require_paths ||= begin full_paths = raw_require_paths.map do |path| File.join full_gem_path, path end full_paths << extension_dir if have_extensions? full_paths end end
在 gem 中要添加到 $LOAD_PATH 的完整路径,当此 gem 被激活时。
Source
# File lib/rubygems/basic_specification.rb, line 220 def gem_dir @gem_dir ||= find_full_gem_path end
返回此 spec 的 gem 目录的完整路径。例如:/usr/local/lib/ruby/1.8/gems/mygem-1.0
TODO:这与 full_gem_path 重复。最终两者之一应该被弃用。
Source
# File lib/rubygems/basic_specification.rb, line 228 def gems_dir raise NotImplementedError end
返回包含此 spec 的 gem 目录的 gems 目录的完整路径。例如:/usr/local/lib/ruby/1.8/gems
Source
# File lib/rubygems/basic_specification.rb, line 86 def ignored? return @ignored unless @ignored.nil? @ignored = missing_extensions? end
如果此 spec 应被忽略(因为它缺少扩展),则返回 true。
Source
# File lib/rubygems/basic_specification.rb, line 325 def lib_dirs_glob dirs = if raw_require_paths if raw_require_paths.size > 1 "{#{raw_require_paths.join(",")}}" else raw_require_paths.first end else "lib" # default value for require_paths for bundler/inline end "#{full_gem_path}/#{dirs}" end
返回一个可用于 Dir.glob 的字符串,用于匹配此 spec 的所有可 require 路径。
Source
# File lib/rubygems/basic_specification.rb, line 308 def matches_for_glob(glob) # TODO: rename? glob = File.join(lib_dirs_glob, glob) Dir[glob] end
返回此 gem 中所有匹配 glob 的文件。
Source
# File lib/rubygems/basic_specification.rb, line 242 def name raise NotImplementedError end
gem 的名称
Source
# File lib/rubygems/basic_specification.rb, line 249 def platform raise NotImplementedError end
gem 的平台
Source
# File lib/rubygems/basic_specification.rb, line 317 def plugins matches_for_glob("rubygems#{Gem.plugin_suffix_pattern}") end
返回此 spec 中的插件列表。
Source
# File lib/rubygems/basic_specification.rb, line 281 def require_paths return raw_require_paths unless have_extensions? [extension_dir].concat raw_require_paths end
在 gem 中要添加到 $LOAD_PATH 的路径,当此 gem 被激活时。
另请参阅 require_paths=
如果您有扩展,则无需将 "ext" 添加到 require 路径,扩展构建过程会将扩展文件复制到“lib”中。
默认值为 "lib"
用法
# If all library files are in the root directory... spec.require_path = '.'
Source
# File lib/rubygems/basic_specification.rb, line 291 def source_paths paths = raw_require_paths.dup if have_extensions? ext_dirs = extensions.map do |extension| extension.split(File::SEPARATOR, 2).first end.uniq paths.concat ext_dirs end paths.uniq end
返回源文件的路径,供分析和文档工具使用。这些路径相对于 full_gem_path。
Source
# File lib/rubygems/basic_specification.rb, line 357 def stubbed? raise NotImplementedError end
此规范是否被 stubbed - 即,我们从 stub 行获得了 gem 的信息,而无需评估整个 gemspec 文件。
Source
# File lib/rubygems/basic_specification.rb, line 200 def to_fullpath(path) if activated? @paths_map ||= {} Gem.suffixes.each do |suf| full_require_paths.each do |dir| fullpath = "#{dir}/#{path}#{suf}" next unless File.file?(fullpath) @paths_map[path] ||= fullpath end end @paths_map[path] end end
目标库文件的完整路径。如果文件不在此 gem 中,则返回 nil。
Source
# File lib/rubygems/basic_specification.rb, line 342 def to_spec raise NotImplementedError end
从这个 gem 返回一个 Gem::Specification
Source
# File lib/rubygems/basic_specification.rb, line 349 def version raise NotImplementedError end
gem 的版本
私有实例方法
Source
# File lib/rubygems/basic_specification.rb, line 367 def have_extensions? !extensions.empty? end
Source
# File lib/rubygems/basic_specification.rb, line 371 def have_file?(file, suffixes) return true if raw_require_paths.any? do |path| base = File.join(gems_dir, full_name, path, file) suffixes.any? {|suf| File.file? base + suf } end if have_extensions? base = File.join extension_dir, file suffixes.any? {|suf| File.file? base + suf } else false end end