class Gem::BasicSpecification
BasicSpecification
是一个抽象类,它实现了一些 Specification 和 StubSpecification 都使用的公共代码。
属性
此 gemspec 加载的路径。此属性不会持久化。
公共类方法
源码
# File lib/rubygems/basic_specification.rb, line 37 def self.default_specifications_dir Gem.default_specifications_dir end
公共实例方法
源码
# File lib/rubygems/basic_specification.rb, line 57 def activated? raise NotImplementedError end
当 gem 已激活时为 true
源码
# File lib/rubygems/basic_specification.rb, line 66 def base_dir raise NotImplementedError end
返回基本 gem 目录的完整路径。
例如: /usr/local/lib/ruby/gems/1.8
源码
# File lib/rubygems/basic_specification.rb, line 116 def base_dir_priority(gem_path) gem_path.index(base_dir) || gem_path.size end
在 gem_path
中位置较高的 Gem 具有优先权
源码
# File lib/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
如果此规范可以 require file
,则返回 true。
源码
# File lib/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
此 gem 的数据目录路径。
源码
# File lib/rubygems/basic_specification.rb, line 101 def default_gem? !loaded_from.nil? && File.dirname(loaded_from) == Gem.default_specifications_dir end
源码
# File lib/rubygems/basic_specification.rb, line 109 def default_gem_priority default_gem? ? 1 : -1 end
常规 gem 优先于默认 gem
源码
# File lib/rubygems/basic_specification.rb, line 123 def extension_dir @extension_dir ||= File.expand_path(File.join(extensions_dir, full_name)) end
返回 gem 扩展安装的目录的完整路径。
源码
# File lib/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
返回扩展目录的路径。
源码
# File lib/rubygems/basic_specification.rb, line 147 def full_gem_path @full_gem_path ||= find_full_gem_path end
gem 的完整路径(安装路径 + 完整名称)。
待办事项:这与 gem_dir
重复。最终应该弃用其中一个。
源码
# File lib/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
的完整名称(名称-版本)。如果指定了平台且不是默认的 Ruby 平台,则会包含平台信息(名称-版本-平台)。
源码
# File lib/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
的完整名称(请参阅 ‘Gem::BasicSpecification#full_name’)。如果未安装在默认的 GEM_HOME 中,则还会包含有关 gem 安装位置的信息。
源码
# File lib/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 时要添加到 $LOAD_PATH
的 gem 中的完整路径。
源码
# File lib/rubygems/basic_specification.rb, line 226 def gem_dir @gem_dir ||= find_full_gem_path end
返回此规范的 gem 目录的完整路径。例如:/usr/local/lib/ruby/1.8/gems/mygem-1.0
待办事项:这与 full_gem_path
重复。最终应该弃用其中一个。
源码
# File lib/rubygems/basic_specification.rb, line 234 def gems_dir raise NotImplementedError end
返回包含此规范的 gem 目录的 gems 目录的完整路径。例如:/usr/local/lib/ruby/1.8/gems
源码
# File lib/rubygems/basic_specification.rb, line 95 def ignored? return @ignored unless @ignored.nil? @ignored = missing_extensions? end
如果此规范因缺少扩展而应被忽略,则返回 true。
源码
# File lib/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
返回一个可在 Dir.glob
中使用的字符串,以匹配此规范的所有可 require 的路径。
源码
# File lib/rubygems/basic_specification.rb, line 307 def matches_for_glob(glob) # TODO: rename? glob = File.join(lib_dirs_glob, glob) Dir[glob] end
返回此 gem 中与 glob
匹配的所有文件。
源码
# File lib/rubygems/basic_specification.rb, line 248 def name raise NotImplementedError end
gem 的名称
源码
# File lib/rubygems/basic_specification.rb, line 255 def platform raise NotImplementedError end
gem 的平台
源码
# File lib/rubygems/basic_specification.rb, line 316 def plugins matches_for_glob("rubygems#{Gem.plugin_suffix_pattern}") end
返回此规范中的插件列表。
源码
# File lib/rubygems/basic_specification.rb, line 280 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 = '.'
源码
# File lib/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
返回源文件的路径,以便用于分析和文档工具。这些路径相对于 full_gem_path。
源码
# File lib/rubygems/basic_specification.rb, line 356 def stubbed? raise NotImplementedError end
此规范是否被存根 - 即,我们从存根行获取了有关 gem 的信息,而无需评估整个 gemspec 文件。
源码
# File lib/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 中,则返回 nil。
源码
# File lib/rubygems/basic_specification.rb, line 341 def to_spec raise NotImplementedError end
从此 gem 返回一个 Gem::Specification
源码
# File lib/rubygems/basic_specification.rb, line 348 def version raise NotImplementedError end
gem 的版本
私有实例方法
源码
# File lib/rubygems/basic_specification.rb, line 366 def have_extensions? !extensions.empty? end
源码
# File lib/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