class Gem::BasicSpecification

BasicSpecification 是一个抽象类,它实现了一些 Specification 和 StubSpecification 都使用的通用代码。

属性

loaded_from[RW]

此 gemspec 从中加载的路径。此属性不会被持久化。

公共类方法

default_specifications_dir() 点击切换源代码
# File rubygems/basic_specification.rb, line 37
def self.default_specifications_dir
  Gem.default_specifications_dir
end
new() 点击切换源代码
# File rubygems/basic_specification.rb, line 33
def initialize
  internal_init
end

公共实例方法

activated?() 点击切换源代码

当 gem 已激活时为真

# File rubygems/basic_specification.rb, line 57
def activated?
  raise NotImplementedError
end
base_dir() 点击切换源代码

返回 gem 基础目录的完整路径。

例如: /usr/local/lib/ruby/gems/1.8

# File rubygems/basic_specification.rb, line 66
def base_dir
  raise NotImplementedError
end
base_dir_priority(gem_path) 点击切换源代码

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
contains_requirable_file?(file) 点击切换源代码

如果此规范可以 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
datadir() 点击切换源代码

此 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
default_gem?() 点击切换源代码
# File rubygems/basic_specification.rb, line 101
def default_gem?
  !loaded_from.nil? &&
    File.dirname(loaded_from) == Gem.default_specifications_dir
end
default_gem_priority() 点击切换源代码

普通 gem 的优先级高于默认 gem

# File rubygems/basic_specification.rb, line 109
def default_gem_priority
  default_gem? ? 1 : -1
end
extension_dir() 点击切换源代码

返回 gem 的扩展安装目录的完整路径。

# File rubygems/basic_specification.rb, line 123
def extension_dir
  @extension_dir ||= File.expand_path(File.join(extensions_dir, full_name))
end
extensions_dir() 点击切换源代码

返回扩展目录的路径。

# 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
full_gem_path() 点击切换源代码

gem 的完整路径(安装路径 + 完整名称)。

TODO: 这与 gem_dir 重复。最终应该弃用其中之一。

# File rubygems/basic_specification.rb, line 147
def full_gem_path
  @full_gem_path ||= find_full_gem_path
end
full_name() 点击切换源代码

返回此 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
full_name_with_location() 点击切换源代码

返回此 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
full_require_paths() 点击切换源代码

当此 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_dir() 点击切换源代码

返回此规范的 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
gems_dir() 点击切换源代码

返回包含此规范的 gem 目录的 gems 目录的完整路径。例如:/usr/local/lib/ruby/1.8/gems

# File rubygems/basic_specification.rb, line 234
def gems_dir
  raise NotImplementedError
end
ignored?() 点击切换源代码

如果此规范由于缺少扩展而应被忽略,则返回 true。

# File rubygems/basic_specification.rb, line 95
def ignored?
  return @ignored unless @ignored.nil?

  @ignored = missing_extensions?
end
lib_dirs_glob() 点击切换源代码

返回一个可用于 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
matches_for_glob(glob) 点击切换源代码

返回此 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
name() 点击切换源代码

gem 的名称

# File rubygems/basic_specification.rb, line 248
def name
  raise NotImplementedError
end
platform() 点击切换源代码

gem 的平台

# File rubygems/basic_specification.rb, line 255
def platform
  raise NotImplementedError
end
plugins() 点击切换源代码

返回此规范中的插件列表。

# File rubygems/basic_specification.rb, line 316
def plugins
  matches_for_glob("rubygems#{Gem.plugin_suffix_pattern}")
end
require_paths() 点击切换源代码

当此 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
source_paths() 点击切换源代码

返回用于分析和文档工具的源文件路径。这些路径相对于 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
stubbed?() 点击切换源代码

此规范是否被存根 - 即,我们从存根行获取有关 gem 的信息,而无需评估整个 gemspec 文件。

# File rubygems/basic_specification.rb, line 356
def stubbed?
  raise NotImplementedError
end
this() 点击切换源代码
# File rubygems/basic_specification.rb, line 360
def this
  self
end
to_fullpath(path) 点击切换源代码

目标库文件的完整路径。如果该文件不在此 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
to_spec() 点击切换源代码

从此 gem 返回 Gem::Specification

# File rubygems/basic_specification.rb, line 341
def to_spec
  raise NotImplementedError
end
version() 点击切换源代码

gem 的版本

# File rubygems/basic_specification.rb, line 348
def version
  raise NotImplementedError
end

私有实例方法

have_extensions?() 点击切换源代码
# File rubygems/basic_specification.rb, line 366
def have_extensions?
  !extensions.empty?
end
have_file?(file, suffixes) 点击切换源代码
# 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