class Gem::BasicSpecification
BasicSpecification
是一个抽象类,它实现了一些 Specification 和 StubSpecification 都使用的通用代码。
属性
此 gemspec 从中加载的路径。此属性不会被持久化。
公共类方法
# File rubygems/basic_specification.rb, line 37 def self.default_specifications_dir Gem.default_specifications_dir end
# File rubygems/basic_specification.rb, line 33 def initialize internal_init end
公共实例方法
当 gem 已激活时为真
# File rubygems/basic_specification.rb, line 57 def activated? raise NotImplementedError end
返回 gem 基础目录的完整路径。
例如: /usr/local/lib/ruby/gems/1.8
# File rubygems/basic_specification.rb, line 66 def base_dir raise NotImplementedError end
在 gem_path
中位置较高的 Gem 具有更高的优先级
# File rubygems/basic_specification.rb, line 116 def base_dir_priority(gem_path) gem_path.index(base_dir) || gem_path.size end
如果此规范可以 require file
,则返回 true。
# File rubygems/basic_specification.rb, line 73 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
此 gem 的数据目录的路径。
# File rubygems/basic_specification.rb, line 197 def datadir # TODO: drop the extra ", gem_name" which is uselessly redundant File.expand_path(File.join(gems_dir, full_name, "data", name)) end
# File rubygems/basic_specification.rb, line 101 def default_gem? !loaded_from.nil? && File.dirname(loaded_from) == Gem.default_specifications_dir end
普通 gem 的优先级高于默认 gem
# File rubygems/basic_specification.rb, line 109 def default_gem_priority default_gem? ? 1 : -1 end
返回 gem 的扩展安装目录的完整路径。
# File rubygems/basic_specification.rb, line 123 def extension_dir @extension_dir ||= File.expand_path(File.join(extensions_dir, full_name)) end
返回扩展目录的路径。
# File rubygems/basic_specification.rb, line 130 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
gem 的完整路径(安装路径 + 完整名称)。
TODO: 这与 gem_dir
重复。最终应该弃用其中之一。
# File rubygems/basic_specification.rb, line 147 def full_gem_path @full_gem_path ||= find_full_gem_path end
返回此 Gem
的完整名称(名称-版本)。如果指定了平台并且不是默认 Ruby 平台,则会包含平台信息(名称-版本-平台)。
# File rubygems/basic_specification.rb, line 156 def full_name if platform == Gem::Platform::RUBY || platform.nil? "#{name}-#{version}" else "#{name}-#{version}-#{platform}" end end
返回此 Gem
的完整名称(请参阅 'Gem::BasicSpecification#full_name')。如果未安装在默认 GEM_HOME 中,还会包含有关 gem 安装位置的信息。
# File rubygems/basic_specification.rb, line 169 def full_name_with_location if base_dir != Gem.dir "#{full_name} in #{base_dir}" else full_name end end
当此 gem 被激活时,要添加到 $LOAD_PATH
中的 gem 中的完整路径。
# File rubygems/basic_specification.rb, line 181 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 目录的完整路径。例如:/usr/local/lib/ruby/1.8/gems/mygem-1.0
TODO: 这与 full_gem_path
重复。最终应该弃用其中之一。
# File rubygems/basic_specification.rb, line 226 def gem_dir @gem_dir ||= find_full_gem_path end
返回包含此规范的 gem 目录的 gems 目录的完整路径。例如:/usr/local/lib/ruby/1.8/gems
# File rubygems/basic_specification.rb, line 234 def gems_dir raise NotImplementedError end
如果此规范由于缺少扩展而应被忽略,则返回 true。
# File rubygems/basic_specification.rb, line 95 def ignored? return @ignored unless @ignored.nil? @ignored = missing_extensions? end
返回一个可用于 Dir.glob 的字符串,以匹配此规范的所有可 require 的路径。
# File rubygems/basic_specification.rb, line 324 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
返回此 gem 中与 glob
匹配的所有文件。
# File rubygems/basic_specification.rb, line 307 def matches_for_glob(glob) # TODO: rename? glob = File.join(lib_dirs_glob, glob) Dir[glob] end
gem 的名称
# File rubygems/basic_specification.rb, line 248 def name raise NotImplementedError end
gem 的平台
# File rubygems/basic_specification.rb, line 255 def platform raise NotImplementedError end
返回此规范中的插件列表。
# File rubygems/basic_specification.rb, line 316 def plugins matches_for_glob("rubygems#{Gem.plugin_suffix_pattern}") end
当此 gem 被激活时,要添加到 $LOAD_PATH
的 gem 中的路径。
另请参阅 require_paths=
如果您有扩展,则无需将 "ext"
添加到 require 路径,扩展构建过程会将扩展文件复制到“lib”中。
默认值为 "lib"
用法
# If all library files are in the root directory... spec.require_path = '.'
# File rubygems/basic_specification.rb, line 280 def require_paths return raw_require_paths unless have_extensions? [extension_dir].concat raw_require_paths end
返回用于分析和文档工具的源文件路径。这些路径相对于 full_gem_path。
# File rubygems/basic_specification.rb, line 290 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
此规范是否被存根 - 即,我们从存根行获取有关 gem 的信息,而无需评估整个 gemspec 文件。
# File rubygems/basic_specification.rb, line 356 def stubbed? raise NotImplementedError end
# File rubygems/basic_specification.rb, line 360 def this self end
目标库文件的完整路径。如果该文件不在此 gem 中,则返回 nil。
# File rubygems/basic_specification.rb, line 206 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 返回 Gem::Specification
# File rubygems/basic_specification.rb, line 341 def to_spec raise NotImplementedError end
gem 的版本
# File rubygems/basic_specification.rb, line 348 def version raise NotImplementedError end
私有实例方法
# File rubygems/basic_specification.rb, line 366 def have_extensions? !extensions.empty? end
# File rubygems/basic_specification.rb, line 370 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