module Gem
RubyGems 是 Ruby 发布和管理第三方库的标准。 (RubyGems is the Ruby standard for publishing and managing third party libraries.)
有关用户文档,请参阅 (For user documentation, see)
-
gem help和gem help [command](gem helpandgem help [command])
有关 gem 开发者文档,请参阅 (For gem developer documentation see)
-
Gem::Version用于版本依赖说明 (Gem::Versionfor version dependency notes)
更多 RubyGems 文档可在以下网址找到 (Further RubyGems documentation can be found at)
-
RubyGems API (也可从
gem server获取) (RubyGems API (also available fromgem server))
RubyGems 插件 (RubyGems Plugins)
RubyGems 将加载已安装的每个 gem 或 $LOAD_PATH 中最新版本内的插件。插件必须命名为 'rubygems_plugin' (.rb, .so 等),并放置在 gem 的 require_path 的根目录。插件安装在特殊位置并在启动时加载。 (RubyGems will load plugins in the latest version of each installed gem or $LOAD_PATH. Plugins must be named ‘rubygems_plugin’ (.rb, .so, etc) and placed at the root of your gem’s require_path. Plugins are installed at a special location and loaded on boot.)
例如,请参阅 Graph gem,它添加了一个 gem graph 命令。 (For an example plugin, see the Graph gem which adds a gem graph command.)
RubyGems 默认值、打包 (RubyGems Defaults, Packaging)
RubyGems 默认值存储在 lib/rubygems/defaults.rb 中。如果您正在打包 RubyGems 或实现 Ruby,则可以更改 RubyGems 的默认值。 (RubyGems defaults are stored in lib/rubygems/defaults.rb. If you’re packaging RubyGems or implementing Ruby you can change RubyGems’ defaults.)
对于 RubyGems 打包者,请提供 lib/rubygems/defaults/operating_system.rb 并覆盖 lib/rubygems/defaults.rb 中的任何默认值。 (For RubyGems packagers, provide lib/rubygems/defaults/operating_system.rb and override any defaults from lib/rubygems/defaults.rb.)
对于 Ruby 实现者,请提供 lib/rubygems/defaults/#{RUBY_ENGINE}.rb 并覆盖 lib/rubygems/defaults.rb 中的任何默认值。 (For Ruby implementers, provide lib/rubygems/defaults/#{RUBY_ENGINE}.rb and override any defaults from lib/rubygems/defaults.rb.)
如果您需要 RubyGems 在安装或卸载时执行额外工作,您的默认值覆盖文件可以设置安装和卸载前/后的钩子。请参阅 Gem::pre_install、Gem::pre_uninstall、Gem::post_install、Gem::post_uninstall。 (If you need RubyGems to perform extra work on install or uninstall, your defaults override file can set pre/post install and uninstall hooks. See Gem::pre_install, Gem::pre_uninstall, Gem::post_install, Gem::post_uninstall.)
Bug
您可以在 GitHub 上的 RubyGems bug tracker 提交错误 (You can submit bugs to the RubyGems bug tracker on GitHub)
致谢 (Credits)
RubyGems 目前由 Eric Hodel 维护。 (RubyGems is currently maintained by Eric Hodel.)
RubyGems 最初由以下人员于 2003 年 RubyConf 开发: (RubyGems was originally developed at RubyConf 2003 by)
-
Rich Kilmer – rich(at)infoether.com
-
Chad Fowler – chad(at)chadfowler.com
-
David Black – dblack(at)wobblini.net
-
Paul Brannan – paul(at)atdesk.com
-
Jim Weirich – jim(at)weirichhouse.org
贡献者 (Contributors)
-
Gavin Sinclair – gsinclair(at)soyabean.com.au
-
George Marrows – george.marrows(at)ntlworld.com
-
Dick Davies – rasputnik(at)hellooperator.net
-
Mauricio Fernandez – batsman.geo(at)yahoo.com
-
Simon Strandgaard – neoneye(at)adslhome.dk
-
Dave Glasser – glasser(at)mit.edu
-
Paul Duncan – pabs(at)pablotron.org
-
Ville Aine – vaine(at)cs.helsinki.fi
-
Eric Hodel – drbrain(at)segment7.net
-
Daniel Berger – djberg96(at)gmail.com
-
Phil Hagelberg – technomancy(at)gmail.com
-
Ryan Davis – ryand-ruby(at)zenspider.com
-
Evan Phoenix – evan(at)fallingsnow.net
-
Steve Klabnik – steve(at)steveklabnik.com
(如果缺少您的名字,请告知我们! ) ((If your name is missing, PLEASE let us know!))
许可证
请参阅 LICENSE.txt 以了解权限。 (See LICENSE.txt for permissions.)
谢谢! (Thanks!)
-RubyGems 团队 (-The RubyGems Team)
Constants
- DEFAULT_HOST
- DEFAULT_SOURCE_DATE_EPOCH
-
如果不指定 SOURCE_DATE_EPOCH 的默认值。我们希望日期在 1980-01-01 之后,以避免 Zip 文件出现问题。这个特定的时间戳是 1980-01-02 00:00:00 GMT。 (The default value for SOURCE_DATE_EPOCH if not specified. We want a date after 1980-01-01, to prevent issues with Zip files. This particular timestamp is for 1980-01-02 00:00:00 GMT.)
- GEM_DEP_FILES
- LOADED_SPECS_MUTEX
- MARSHAL_SPEC_DIR
-
远程仓库中
Marshal快速 gemspec 的位置 (Location ofMarshalquick gemspecs on remote repositories) - RDoc
- REPOSITORY_DEFAULT_GEM_SUBDIRECTORIES
-
默认 gem 的 gem 仓库中的子目录 (Subdirectories in a gem repository for default gems)
- REPOSITORY_SUBDIRECTORIES
-
gem 仓库中的子目录 (Subdirectories in a gem repository)
- RUBYGEMS_DIR
- VERSION
- WIN_PATTERNS
-
一个匹配 Windows Ruby 平台的正则表达式
Array。 (AnArrayof Regexps that match windows Ruby platforms.)
属性
RubyGems 分发者(如操作系统包管理器)可以通过将此设置为 gem update –system 时打印给最终用户的错误消息来禁用 RubyGems 更新,而不是实际更新。 (RubyGems distributors (like operating system package managers) can disable RubyGems update by setting this to error message printed to end-users on gem update –system instead of actual update.)
RubyGems 是否会增强内置的 ‘require` 方法,使其自动检查所请求的路径是否存在于已安装的 gem 中,并自动激活它们并将它们添加到 `$LOAD_PATH`。 (Whether RubyGems should enhance builtin ‘require` to automatically check whether the path required is present in installed gems, and automatically activate them and add them to `$LOAD_PATH`.)
在 Gem::DependencyInstaller 安装一组 gem 后运行的钩子列表 (The list of hooks to be run after Gem::DependencyInstaller installs a set of gems)
GemDependencyAPI 对象,在调用 .use_gemdeps 时设置。它包含 Gemfile 中的所有信息。 (GemDependencyAPI object, which is set when .use_gemdeps is called. This contains all the information from the Gemfile.)
已加载 Gem::Specification 的 Hash,按名称键 (Hash of loaded Gem::Specification keyed by name)
在 Gem::Installer#install 提取文件并构建扩展后运行的钩子列表 (The list of hooks to be run after Gem::Installer#install extracts files and builds extensions)
在 Gem::Installer#install 完成安装后运行的钩子列表 (The list of hooks to be run after Gem::Installer#install completes installation)
在运行 Gem::Specification.reset 后运行的钩子列表 (The list of hooks to be run after Gem::Specification.reset is run.)
在 Gem::Uninstaller#uninstall 完成安装后运行的钩子列表 (The list of hooks to be run after Gem::Uninstaller#uninstall completes installation)
在 Gem::Installer#install 执行任何工作之前运行的钩子列表 (The list of hooks to be run before Gem::Installer#install does any work)
在运行 Gem::Specification.reset 之前运行的钩子列表 (The list of hooks to be run before Gem::Specification.reset is run.)
在 Gem::Uninstaller#uninstall 执行任何工作之前运行的钩子列表 (The list of hooks to be run before Gem::Uninstaller#uninstall does any work)
Public Class Methods
Source
# File lib/rubygems.rb, line 281 def self.activate_and_load_bin_path(name, exec_name = nil, *requirements) spec = find_and_activate_spec_for_exe name, exec_name, requirements if spec.name == "bundler" # Old versions of Bundler need a workaround to support nested `bundle # exec` invocations by overriding `Gem.activate_bin_path`. However, # RubyGems now uses this new `Gem.activate_and_load_bin_path` helper in # binstubs, which is of course not overridden in Bundler since it didn't # exist at the time. So, include the override here to workaround that. load ENV["BUNDLE_BIN_PATH"] if ENV["BUNDLE_BIN_PATH"] && spec.version <= Gem::Version.create("2.5.22") # Make sure there's no version of Bundler in `$LOAD_PATH` that's different # from the version we just activated. If that was the case (it happens # when testing Bundler from ruby/ruby), we would load Bundler extensions # to RubyGems from the copy in `$LOAD_PATH` but then load the binstub from # an installed copy, causing those copies to be mixed and yet more # redefinition warnings. # require_path = $LOAD_PATH.resolve_feature_path("bundler").last.delete_suffix("/bundler.rb") Gem.load_bundler_extensions(spec.version) if spec.full_require_paths.include?(require_path) end load spec.bin_file(exec_name) end
查找并加载 gem name 的可执行文件的完整路径。如果未提供 exec_name,则会引发异常,否则将返回指定可执行文件的路径。requirements 允许您指定特定的 gem 版本。 (Find and activate the full path to the executable for gem name. If the exec_name is not given, an exception will be raised, otherwise the specified executable’s path is returned. requirements allows you to specify specific gem versions.)
此方法的副作用是它将激活包含可执行文件的 gem。 (A side effect of this method is that it will activate the gem that contains the executable.)
此方法 **只能** 在 bin 存根文件中使用。 (This method should only be used in bin stub files.)
Source
# File lib/rubygems.rb, line 624 def self.activated_gem_paths @activated_gem_paths ||= 0 end
已激活 gem 的 $LOAD_PATH 中的路径数。用于在 `require` 期间优先处理 `-I` 和 `ENV['RUBYLIB']` 条目。 (The number of paths in the +$LOAD_PATH+ from activated gems. Used to prioritize -I and ENV['RUBYLIB'] entries during require.)
Source
# File lib/rubygems.rb, line 631 def self.add_to_load_path(*paths) @activated_gem_paths = activated_gem_paths + paths.size # gem directories must come after -I and ENV['RUBYLIB'] $LOAD_PATH.insert(Gem.load_path_insert_index, *paths) end
将一个路径列表添加到 $LOAD_PATH 的正确位置。 (Add a list of paths to the $LOAD_PATH at the proper place.)
Source
# File lib/rubygems.rb, line 229 def self.bin_path(name, exec_name = nil, *requirements) requirements = Gem::Requirement.default if requirements.empty? find_spec_for_exe(name, exec_name, requirements).bin_file exec_name end
查找 gem name 的可执行文件的完整路径。如果未提供 exec_name,则会引发异常,否则将返回指定可执行文件的路径。requirements 允许您指定特定的 gem 版本。 (Find the full path to the executable for gem name. If the exec_name is not given, an exception will be raised, otherwise the specified executable’s path is returned. requirements allows you to specify specific gem versions.)
Source
# File lib/rubygems.rb, line 324 def self.binary_mode "rb" end
以纯二进制模式读取文件所需的模式。 (The mode needed to read a file as straight binary.)
Source
# File lib/rubygems.rb, line 331 def self.bindir(install_dir = Gem.dir) return File.join install_dir, "bin" unless install_dir.to_s == Gem.default_dir.to_s Gem.default_bindir end
安装 gem 可执行文件的路径。 (The path where gem executables are to be installed.)
Source
# File lib/rubygems/defaults.rb, line 147 def self.cache_home @cache_home ||= ENV["XDG_CACHE_HOME"] || File.join(Gem.user_home, ".cache") end
用户缓存目录的标准位置路径。 (The path to standard location of the user’s cache directory.)
Source
# File lib/rubygems.rb, line 1317 def clear_default_specs @path_to_default_spec_map.clear end
清除默认 gem 相关变量。用于测试。 (Clear default gem related variables. It is for test)
Source
# File lib/rubygems.rb, line 349 def self.clear_paths @paths = nil @user_home = nil Gem::Specification.reset Gem::Security.reset if defined?(Gem::Security) end
重置 dir 和 path 值。下一次请求 dir 或 path 时,将重新计算值。这主要由单元测试用于提供测试隔离。 (Reset the dir and path values. The next time dir or path is requested, the values will be calculated from scratch. This is mainly used by the unit tests to provide test isolation.)
Source
# File lib/rubygems/defaults.rb, line 133 def self.config_file @config_file ||= find_config_file end
用户 .gemrc 文件的标准位置路径。 (The path to standard location of the user’s .gemrc file.)
Source
# File lib/rubygems/defaults.rb, line 114 def self.config_home @config_home ||= ENV["XDG_CONFIG_HOME"] || File.join(Gem.user_home, ".config") end
用户配置目录的标准位置路径。 (The path to standard location of the user’s configuration directory.)
Source
# File lib/rubygems.rb, line 359 def self.configuration @configuration ||= Gem::ConfigFile.new [] end
gem 的标准配置对象。 (The standard configuration object for gems.)
Source
# File lib/rubygems.rb, line 367 def self.configuration=(config) @configuration = config end
使用给定的配置对象(它实现了 ConfigFile 协议)作为标准配置对象。 (Use the given configuration object (which implements the ConfigFile protocol) as the standard configuration object.)
Source
# File lib/rubygems/defaults.rb, line 154 def self.data_home @data_home ||= ENV["XDG_DATA_HOME"] || File.join(Gem.user_home, ".local", "share") end
用户数据目录的标准位置路径。 (The path to standard location of the user’s data directory.)
Source
# File lib/rubygems/defaults.rb, line 204 def self.default_bindir RbConfig::CONFIG["bindir"] end
二进制文件的默认目录 (The default directory for binaries)
Source
# File lib/rubygems/defaults.rb, line 228 def self.default_cert_path default_cert_path = File.join Gem.user_home, ".gem", "gem-public_cert.pem" unless File.exist?(default_cert_path) default_cert_path = File.join Gem.data_home, "gem", "gem-public_cert.pem" end default_cert_path end
默认签名证书链路径 (The default signing certificate chain path)
Source
# File lib/rubygems/defaults.rb, line 37 def self.default_dir @default_dir ||= File.join(RbConfig::CONFIG["rubylibprefix"], "gems", RbConfig::CONFIG["ruby_version"]) end
如果环境变量未指定备用值,则使用的默认主目录路径 (Default home directory path to be used if an alternate value is not specified in the environment)
Source
# File lib/rubygems/defaults.rb, line 186 def self.default_exec_format exec_format = begin RbConfig::CONFIG["ruby_install_name"].sub("ruby", "%s") rescue StandardError "%s" end unless exec_format.include?("%s") raise Gem::Exception, "[BUG] invalid exec_format #{exec_format.inspect}, no %s" end exec_format end
从 Ruby 的安装名称推断其 –program-prefix 和 –program-suffix (Deduce Ruby’s –program-prefix and –program-suffix from its install name)
Source
# File lib/rubygems/defaults.rb, line 48 def self.default_ext_dir_for(base_dir) nil end
返回指定 RubyGems 基本目录的二进制扩展目录,如果无法确定此类目录,则返回 nil。 (Returns binary extensions dir for specified RubyGems base dir or nil if such directory cannot be determined.)
默认情况下,二进制扩展与它们的 Ruby 对等项并排,因此返回 nil。 (By default, the binary extensions are located side by side with their Ruby counterparts, therefore nil is returned)
Source
# File lib/rubygems/defaults.rb, line 215 def self.default_key_path default_key_path = File.join Gem.user_home, ".gem", "gem-private_key.pem" unless File.exist?(default_key_path) default_key_path = File.join Gem.data_home, "gem", "gem-private_key.pem" end default_key_path end
默认签名密钥路径 (The default signing key path)
Source
# File lib/rubygems/defaults.rb, line 175 def self.default_path path = [] path << user_dir if user_home && File.exist?(user_home) path << default_dir path << vendor_dir if vendor_dir && File.directory?(vendor_dir) path end
默认 gem 加载路径 (Default gem load path)
Source
# File lib/rubygems/defaults.rb, line 55 def self.default_rubygems_dirs nil # default to standard layout end
RubyGems 的 .rb 文件和 bin 文件安装的路径 (Paths where RubyGems’ .rb files and bin files are installed)
Source
# File lib/rubygems/defaults.rb, line 15 def self.default_sources @default_sources ||= %w[https://rubygems.org.cn/] end
Source
# File lib/rubygems/defaults.rb, line 23 def self.default_spec_cache_dir default_spec_cache_dir = File.join Gem.user_home, ".gem", "specs" unless File.exist?(default_spec_cache_dir) default_spec_cache_dir = File.join Gem.cache_home, "gem", "specs" end default_spec_cache_dir end
如果环境变量未指定备用值,则使用的默认 spec 目录路径 (Default spec directory path to be used if an alternate value is not specified in the environment)
Source
# File lib/rubygems/defaults.rb, line 62 def self.default_specifications_dir @default_specifications_dir ||= File.join(Gem.default_dir, "specifications", "default") end
默认 gem 的规范文件路径。 (Path to specification files of default gems.)
Source
# File lib/rubygems.rb, line 374 def self.deflate(data) require "zlib" Zlib::Deflate.deflate data end
Zlib::Deflate.deflate 的包装器 (A Zlib::Deflate.deflate wrapper)
Source
# File lib/rubygems.rb, line 422 def self.dir paths.home end
安装 gem 的路径。 (The path where gems are to be installed.)
Source
# File lib/rubygems.rb, line 759 def self.done_installing(&hook) @done_installing_hooks << hook end
添加一个 post-installs 钩子,当 Gem::DependencyInstaller#install 完成时,它将接收一个 Gem::DependencyInstaller 和已安装的规范列表。 (Adds a post-installs hook that will be passed a Gem::DependencyInstaller and a list of installed specifications when Gem::DependencyInstaller#install is complete)
Source
# File lib/rubygems.rb, line 1040 def self.dynamic_library_suffixes @dynamic_library_suffixes ||= suffixes - [".rb"] end
动态库可加载路径的后缀。 (Suffixes for dynamic library require-able paths.)
Source
# File lib/rubygems.rb, line 473 def self.ensure_default_gem_subdirectories(dir = Gem.dir, mode = nil) ensure_subdirectories(dir, mode, REPOSITORY_DEFAULT_GEM_SUBDIRECTORIES) end
安静地确保 Gem 目录 dir 包含处理默认 gem 的所有适当子目录。如果我们因权限问题无法创建目录,我们将继续执行。 (Quietly ensure the Gem directory dir contains all the proper subdirectories for handling default gems. If we can’t create a directory due to a permission problem, then we will silently continue.)
如果提供了 mode,则使用此模式创建缺少的目录。 (If mode is given, missing directories are created with this mode.)
永远不会创建全局可写目录。 (World-writable directories will never be created.)
Source
# File lib/rubygems.rb, line 460 def self.ensure_gem_subdirectories(dir = Gem.dir, mode = nil) ensure_subdirectories(dir, mode, REPOSITORY_SUBDIRECTORIES) end
安静地确保 Gem 目录 dir 包含所有适当的子目录。如果我们因权限问题无法创建目录,我们将继续执行。 (Quietly ensure the Gem directory dir contains all the proper subdirectories. If we can’t create a directory due to a permission problem, then we will silently continue.)
如果提供了 mode,则使用此模式创建缺少的目录。 (If mode is given, missing directories are created with this mode.)
永远不会创建全局可写目录。 (World-writable directories will never be created.)
Source
# File lib/rubygems.rb, line 908 def self.env_requirement(gem_name) @env_requirements_by_name ||= {} @env_requirements_by_name[gem_name] ||= begin req = ENV["GEM_REQUIREMENT_#{gem_name.upcase}"] || ">= 0" Gem::Requirement.create(req) end end
Source
# File lib/rubygems/defaults.rb, line 121 def self.find_config_file gemrc = File.join Gem.user_home, ".gemrc" if File.exist? gemrc gemrc else File.join Gem.config_home, "gem", "gemrc" end end
查找用户的配置文件 (Finds the user’s config file)
Source
# File lib/rubygems.rb, line 1302 def find_default_spec(path) @path_to_default_spec_map[path] end
从 path 查找默认 gem 的 Gem::Specification (Find a Gem::Specification of default gem from path)
Source
# File lib/rubygems.rb, line 524 def self.find_files(glob, check_load_path = true) files = [] files = find_files_from_load_path glob if check_load_path gem_specifications = @gemdeps ? Gem.loaded_specs.values : Gem::Specification.stubs files.concat gem_specifications.flat_map {|spec| spec.matches_for_glob("#{glob}#{Gem.suffix_pattern}") } # $LOAD_PATH might contain duplicate entries or reference # the spec dirs directly, so we prune. files.uniq! if check_load_path files end
返回与 glob 匹配的路径列表,gem 可用于从其他 gem 中获取功能。例如: (Returns a list of paths matching glob that can be used by a gem to pick up features from other gems. For example)
Gem.find_files('rdoc/discover').each do |path| load path end
如果 check_load_path 为 true(默认),则 find_files 也会搜索 $LOAD_PATH 中的文件以及 gem。 (if check_load_path is true (the default), then find_files also searches $LOAD_PATH for files as well as gems.)
请注意,find_files 将返回所有文件,即使它们来自同一 gem 的不同版本。另请参阅 find_latest_files (Note that find_files will return all files even if they are from different versions of the same gem. See also find_latest_files)
Source
# File lib/rubygems.rb, line 561 def self.find_latest_files(glob, check_load_path = true) files = [] files = find_files_from_load_path glob if check_load_path files.concat Gem::Specification.latest_specs(true).flat_map {|spec| spec.matches_for_glob("#{glob}#{Gem.suffix_pattern}") } # $LOAD_PATH might contain duplicate entries or reference # the spec dirs directly, so we prune. files.uniq! if check_load_path files end
从最新 gem 中返回与 glob 匹配的路径列表,gem 可用于从其他 gem 中获取功能。例如: (Returns a list of paths matching glob from the latest gems that can be used by a gem to pick up features from other gems. For example)
Gem.find_latest_files('rdoc/discover').each do |path| load path end
如果 check_load_path 为 true(默认),则 find_latest_files 也会搜索 $LOAD_PATH 中的文件以及 gem。 (if check_load_path is true (the default), then find_latest_files also searches $LOAD_PATH for files as well as gems.)
与 find_files 不同,find_latest_files 将仅返回最新 gem 版本中的文件。 (Unlike find_files, find_latest_files will return only files from the latest version of a gem.)
Source
# File lib/rubygems.rb, line 1309 def find_unresolved_default_spec(path) default_spec = @path_to_default_spec_map[path] default_spec if default_spec && loaded_specs[default_spec.name] != default_spec end
从 path 查找默认 gem 的未解析 Gem::Specification (Find an unresolved Gem::Specification of default gem from path)
Source
# File lib/rubygems.rb, line 214 def self.finish_resolve(request_set = Gem::RequestSet.new) request_set.import Gem::Specification.unresolved_deps.values request_set.import Gem.loaded_specs.values.map {|s| Gem::Dependency.new(s.name, s.version) } request_set.resolve_current.each do |s| s.full_spec.activate end end
Source
# File lib/rubygems.rb, line 1098 def self.freebsd_platform? RbConfig::CONFIG["host_os"].to_s.include?("bsd") end
此平台是 FreeBSD 吗? (Is this platform FreeBSD?)
Source
# File lib/rubygems.rb, line 596 def self.host @host ||= Gem::DEFAULT_HOST end
获取默认的 RubyGems API 主机。通常是 https://rubygems.org.cn。 (Get the default RubyGems API host. This is normally https://rubygems.org.cn.)
Source
# File lib/rubygems.rb, line 602 def self.host=(host) @host = host end
设置默认的 RubyGems API 主机。 (Set the default RubyGems API host.)
Source
# File lib/rubygems.rb, line 585 def self.install(name, version = Gem::Requirement.default, *options) require_relative "rubygems/dependency_installer" inst = Gem::DependencyInstaller.new(*options) inst.install name, version inst.installed_gems end
顶层安装辅助方法。允许您交互式安装 gem。 (Top level install helper method. Allows you to install gems interactively)
% irb >> Gem.install "minitest" Fetching: minitest-5.14.0.gem (100%) => [#<Gem::Specification:0x1013b4528 @name="minitest", ...>]
Source
# File lib/rubygems.rb, line 1084 def self.java_platform? RUBY_PLATFORM == "java" end
这是 Java 平台吗? (Is this a java platform?)
Source
# File lib/rubygems.rb, line 933 def self.latest_rubygems_version latest_version_for("rubygems-update") || raise("Can't find 'rubygems-update' in any repo. Check `gem source list`.") end
返回 RubyGems 的最新发布版本。 (Returns the latest release version of RubyGems.)
Source
# File lib/rubygems.rb, line 920 def self.latest_spec_for(name) dependency = Gem::Dependency.new name fetcher = Gem::SpecFetcher.fetcher spec_tuples, = fetcher.spec_for_dependency dependency spec, = spec_tuples.last spec end
返回 gem name 的最新发布版本规范。 (Returns the latest release-version specification for the gem name.)
Source
# File lib/rubygems.rb, line 941 def self.latest_version_for(name) latest_spec_for(name)&.version end
返回 gem name 的最新发布版本的版本。 (Returns the version of the latest release-version of gem name)
Source
# File lib/rubygems.rb, line 668 def self.load_bundler_extensions(version) return unless version <= Gem::Version.create("2.6.9") previous_platforms = {} platform_const_list = ["JAVA", "MSWIN", "MSWIN64", "MINGW", "X64_MINGW_LEGACY", "X64_MINGW", "UNIVERSAL_MINGW", "WINDOWS", "X64_LINUX", "X64_LINUX_MUSL"] platform_const_list.each do |platform| previous_platforms[platform] = Gem::Platform.const_get(platform) Gem::Platform.send(:remove_const, platform) end require "bundler/rubygems_ext" platform_const_list.each do |platform| Gem::Platform.send(:remove_const, platform) if Gem::Platform.const_defined?(platform) Gem::Platform.const_set(platform, previous_platforms[platform]) end end
Source
# File lib/rubygems.rb, line 1133 def self.load_env_plugins load_plugin_files find_files_from_load_path("rubygems_plugin") end
查找 $LOAD_PATH 中的所有 ‘rubygems_plugin’ 文件并加载它们。 (Find all ‘rubygems_plugin’ files in $LOAD_PATH and load them)
Source
# File lib/rubygems.rb, line 610 def self.load_path_insert_index $LOAD_PATH.each_with_index do |path, i| return i if path.instance_variable_defined?(:@gem_prelude_index) end index = $LOAD_PATH.index RbConfig::CONFIG["sitelibdir"] index || 0 end
将激活的 gem 路径插入 $LOAD_PATH 的索引。默认情况下,激活的 gem 的路径会插入到站点库目录之前。 (The index to insert activated gem paths into the $LOAD_PATH. The activated gem’s paths are inserted before site lib directory by default.)
Source
# File lib/rubygems.rb, line 1124 def self.load_plugins Gem.path.each do |gem_path| load_plugin_files Gem::Util.glob_files_in_dir("*#{Gem.plugin_suffix_pattern}", plugindir(gem_path)) end end
查找标准位置中的 rubygems 插件文件并加载它们。 (Find rubygems plugin files in the standard location and load them)
Source
# File lib/rubygems.rb, line 656 def self.load_safe_marshal return if @safe_marshal_loaded require_relative "rubygems/safe_marshal" @safe_marshal_loaded = true end
Source
# File lib/rubygems.rb, line 643 def self.load_yaml return if @yaml_loaded require "psych" require_relative "rubygems/psych_tree" require_relative "rubygems/safe_yaml" @yaml_loaded = true end
Source
# File lib/rubygems.rb, line 702 def self.location_of_caller(depth = 1) caller[depth] =~ /(.*?):(\d+).*?$/i file = $1 lineno = $2.to_i [file, lineno] end
调用此方法之调用的调用者的文件名和行号。 (The file name and line number of the caller of the caller of this method.)
depth 是要向上追溯多少层调用栈。 (depth is how many layers up the call stack it should go.)
例如: (e.g.,)
def a; Gem.location_of_caller; end a #=> [“x.rb”, 2] # (这将因文件名和行号而异) (def a; Gem.location_of_caller; end a #=> [“x.rb”, 2] # (it’ll vary depending on file name and line number))
def b; c; end def c; Gem.location_of_caller(2); end b #=> [“x.rb”, 6] # (这将因文件名和行号而异) (def b; c; end def c; Gem.location_of_caller(2); end b #=> [“x.rb”, 6] # (it’ll vary depending on file name and line number))
Source
# File lib/rubygems.rb, line 713 def self.marshal_version "#{Marshal::MAJOR_VERSION}.#{Marshal::MINOR_VERSION}" end
Source
# File lib/rubygems.rb, line 206 def self.needs rs = Gem::RequestSet.new yield rs finish_resolve rs end
Source
# File lib/rubygems.rb, line 849 def self.open_file(path, flags, &block) File.open(path, flags, &block) end
使用给定标志打开文件。 (Open a file with given flags)
Source
# File lib/rubygems.rb, line 867 def self.open_file_with_flock(path, &block) # read-write mode is used rather than read-only in order to support NFS mode = IO::RDWR | IO::APPEND | IO::CREAT | IO::BINARY mode |= IO::SHARE_DELETE if IO.const_defined?(:SHARE_DELETE) File.open(path, mode) do |io| begin # Try to get a lock without blocking. # If we do, the file is locked. # Otherwise, explain why we're waiting and get a lock, but block this time. if io.flock(File::LOCK_EX | File::LOCK_NB) != 0 warn "Waiting for another process to let go of lock: #{path}" io.flock(File::LOCK_EX) end io.puts(Process.pid) rescue Errno::ENOSYS, Errno::ENOTSUP end yield io end end
使用给定标志打开文件,并使用 flock 保护访问。 (Open a file with given flags, and protect access with flock)
Source
# File lib/rubygems.rb, line 856 def self.open_file_with_lock(path, &block) file_lock = "#{path}.lock" open_file_with_flock(file_lock, &block) ensure require "fileutils" FileUtils.rm_f file_lock end
使用给定标志打开文件,并使用文件锁保护访问。 (Open a file with given flags, and protect access with a file lock)
Source
# File lib/rubygems/defaults.rb, line 286 def self.operating_system_defaults {} end
Ruby 打包者的 gem 命令的默认选项。 (Default options for gem commands for Ruby packagers.)
这里的选项应构造为字符串数组,其中键是“gem”命令名称,值为默认选项字符串。 (The options here should be structured as an array of string “gem” command names as keys and a string of the default options as values.)
示例
def self.operating_system_defaults
{
'install' => '--no-rdoc --no-ri --env-shebang',
'update' => '--no-rdoc --no-ri --env-shebang'
}
end
Source
# File lib/rubygems/defaults.rb, line 168 def self.path_separator File::PATH_SEPARATOR end
Source
# File lib/rubygems.rb, line 382 def self.paths @paths ||= Gem::PathSupport.new(ENV) end
检索 RubyGems 用于查找文件的 PathSupport 对象。 (Retrieve the PathSupport object that RubyGems uses to lookup files.)
Source
# File lib/rubygems.rb, line 392 def self.paths=(env) clear_paths target = {} env.each_pair do |k,v| case k when "GEM_HOME", "GEM_PATH", "GEM_SPEC_CACHE" case v when nil, String target[k] = v when Array unless Gem::Deprecate.skip warn <<-EOWARN Array values in the parameter to `Gem.paths=` are deprecated. Please use a String or nil. An Array (#{env.inspect}) was passed in from #{caller[3]} EOWARN end target[k] = v.join File::PATH_SEPARATOR end else target[k] = v end end @paths = Gem::PathSupport.new ENV.to_hash.merge(target) Gem::Specification.dirs = @paths.path end
从 env 初始化要使用的文件系统路径。env 是一个类似哈希的对象(通常是 ENV),它会查询 'GEM_HOME'、'GEM_PATH' 和 'GEM_SPEC_CACHE'。env 哈希的键应该是字符串,值的哈希应该是字符串或 nil。 (Initialize the filesystem paths to use from env. env is a hash-like object (typically ENV) that is queried for ‘GEM_HOME’, ‘GEM_PATH’, and ‘GEM_SPEC_CACHE’ Keys for the env hash should be Strings, and values of the hash should be Strings or nil.)
Source
# File lib/rubygems/defaults.rb, line 305 def self.platform_defaults {} end
Ruby 实现者的 gem 命令的默认选项。 (Default options for gem commands for Ruby implementers.)
这里的选项应构造为字符串数组,其中键是“gem”命令名称,值为默认选项字符串。 (The options here should be structured as an array of string “gem” command names as keys and a string of the default options as values.)
示例
def self.platform_defaults
{
'install' => '--no-rdoc --no-ri --env-shebang',
'update' => '--no-rdoc --no-ri --env-shebang'
}
end
Source
# File lib/rubygems.rb, line 727 def self.platforms @platforms ||= [] if @platforms.empty? @platforms = [Gem::Platform::RUBY, Gem::Platform.local] end @platforms end
此 RubyGems 支持的平台的 Array。 (Array of platforms this RubyGems supports.)
Source
# File lib/rubygems.rb, line 720 def self.platforms=(platforms) @platforms = platforms end
设置此 RubyGems 支持的平台数组(主要用于测试)。 (Set array of platforms this RubyGems supports (primarily for testing).)
Source
# File lib/rubygems.rb, line 1013 def self.plugin_suffix_pattern @plugin_suffix_pattern ||= "_plugin#{suffix_pattern}" end
可加载插件后缀的 Glob 模式。 (Glob pattern for require-able plugin suffixes.)
Source
# File lib/rubygems.rb, line 1020 def self.plugin_suffix_regexp @plugin_suffix_regexp ||= /_plugin#{suffix_regexp}\z/ end
可加载插件后缀的 Regexp。 (Regexp for require-able plugin suffixes.)
Source
# File lib/rubygems.rb, line 340 def self.plugindir(install_dir = Gem.dir) File.join install_dir, "plugins" end
安装 rubygems 插件的路径。 (The path were rubygems plugins are to be installed.)
Source
# File lib/rubygems.rb, line 742 def self.post_build(&hook) @post_build_hooks << hook end
添加一个 post-build 钩子,当调用 Gem::Installer#install 时,该钩子将接收一个 Gem::Installer 实例。该钩子在 gem 被提取并构建完扩展之后,但在可执行文件或 gemspec 被写入之前调用。如果钩子返回 false,则会删除 gem 文件并中止安装。 (Adds a post-build hook that will be passed an Gem::Installer instance when Gem::Installer#install is called. The hook is called after the gem has been extracted and extensions have been built but before the executables or gemspec has been written. If the hook returns false then the gem’s files will be removed and the install will be aborted.)
Source
# File lib/rubygems.rb, line 750 def self.post_install(&hook) @post_install_hooks << hook end
添加一个 post-install 钩子,当调用 Gem::Installer#install 时,该钩子将接收一个 Gem::Installer 实例。 (Adds a post-install hook that will be passed an Gem::Installer instance when Gem::Installer#install is called)
Source
# File lib/rubygems.rb, line 767 def self.post_reset(&hook) @post_reset_hooks << hook end
添加一个钩子,该钩子将在运行 Gem::Specification.reset 后运行。 (Adds a hook that will get run after Gem::Specification.reset is run.)
Source
# File lib/rubygems.rb, line 776 def self.post_uninstall(&hook) @post_uninstall_hooks << hook end
添加一个 post-uninstall 钩子,当调用 Gem::Uninstaller#uninstall 时,该钩子将接收一个 Gem::Uninstaller 实例和被卸载的 spec。 (Adds a post-uninstall hook that will be passed a Gem::Uninstaller instance and the spec that was uninstalled when Gem::Uninstaller#uninstall is called)
Source
# File lib/rubygems.rb, line 785 def self.pre_install(&hook) @pre_install_hooks << hook end
添加一个 pre-install 钩子,当调用 Gem::Installer#install 时,该钩子将接收一个 Gem::Installer 实例。如果钩子返回 false,则中止安装。 (Adds a pre-install hook that will be passed an Gem::Installer instance when Gem::Installer#install is called. If the hook returns false then the install will be aborted.)
Source
# File lib/rubygems.rb, line 793 def self.pre_reset(&hook) @pre_reset_hooks << hook end
添加一个钩子,该钩子将在运行 Gem::Specification.reset 之前运行。 (Adds a hook that will get run before Gem::Specification.reset is run.)
Source
# File lib/rubygems.rb, line 802 def self.pre_uninstall(&hook) @pre_uninstall_hooks << hook end
添加一个 pre-uninstall 钩子,当调用 Gem::Uninstaller#uninstall 时,该钩子将接收一个 Gem::Uninstaller 实例和将被卸载的 spec。 (Adds a pre-uninstall hook that will be passed an Gem::Uninstaller instance and the spec that will be uninstalled when Gem::Uninstaller#uninstall is called)
Source
# File lib/rubygems.rb, line 811 def self.prefix prefix = File.dirname RUBYGEMS_DIR if prefix != File.expand_path(RbConfig::CONFIG["sitelibdir"]) && prefix != File.expand_path(RbConfig::CONFIG["libdir"]) && File.basename(RUBYGEMS_DIR) == "lib" prefix end end
此 RubyGems 安装到的目录前缀。如果您的前缀位于标准位置(即,RubyGems 安装在您期望的位置),则 prefix 返回 nil。 (The directory prefix this RubyGems was installed at. If your prefix is in a standard location (ie, rubygems is installed where you’d expect it to be), then prefix returns nil.)
Source
# File lib/rubygems/rdoc.rb, line 13 def self.rdoc_hooks_defined_via_plugin? Gem::Version.new(::RDoc::VERSION) >= Gem::Version.new("6.9.0") end
返回 RDoc 是否通过 RubyGems 插件定义了自己的安装钩子。一旦不再支持旧于 6.9.0 的 RDoc 的 Ruby 版本,此项及其保护的内容就可以删除。 (Returns whether RDoc defines its own install hooks through a RubyGems plugin. This and whatever is guarded by it can be removed once no supported Ruby ships with RDoc older than 6.9.0.)
Source
# File lib/rubygems.rb, line 831 def self.read_binary(path) File.binread(path) end
在所有平台上以二进制模式安全地读取文件。 (Safely read a file in binary mode on all platforms.)
Source
# File lib/rubygems.rb, line 824 def self.refresh Gem::Specification.reset end
从磁盘刷新可用 gem。 (Refresh available gems from disk.)
Source
# File lib/rubygems.rb, line 1277 def register_default_spec(spec) extended_require_paths = spec.require_paths.map {|f| f + "/" } new_format = extended_require_paths.any? {|path| spec.files.any? {|f| f.start_with? path } } if new_format prefix_group = extended_require_paths.join("|") prefix_pattern = /^(#{prefix_group})/ end spec.files.each do |file| if new_format file = file.sub(prefix_pattern, "") next unless $~ end spec.activate if already_loaded?(file) @path_to_default_spec_map[file] = spec @path_to_default_spec_map[file.sub(suffix_regexp, "")] = spec end end
为默认 gem 注册一个 Gem::Specification。 (Register a Gem::Specification for default gem.)
支持两种规范格式: (Two formats for the specification are supported)
-
MRI 2.0 风格,其中 spec.files 包含未加前缀的 require 名称。 spec 的文件名将按原样注册。 (MRI 2.0 style, where spec.files contains unprefixed require names. The spec’s filenames will be registered as-is.)
-
新风格,其中 spec.files 包含以 spec.require_paths 的路径加前缀的文件。在注册 spec 的文件名之前会剥离前缀。未加前缀的文件将被省略。 (New style, where spec.files contains files prefixed with paths from spec.require_paths. The prefixes are stripped before registering the spec’s filenames. Unprefixed files are omitted.)
Source
# File lib/rubygems.rb, line 891 def self.ruby if @ruby.nil? @ruby = RbConfig.ruby @ruby = "\"#{@ruby}\"" if /\s/.match?(@ruby) end @ruby end
正在运行的 Ruby 解释器的路径。 (The path to the running Ruby interpreter.)
Source
# File lib/rubygems.rb, line 904 def self.ruby_api_version @ruby_api_version ||= target_rbconfig["ruby_version"].dup end
Source
# File lib/rubygems/defaults.rb, line 208 def self.ruby_engine RUBY_ENGINE end
Source
# File lib/rubygems.rb, line 948 def self.ruby_version return @ruby_version if defined? @ruby_version version = RUBY_VERSION.dup if RUBY_PATCHLEVEL == -1 if RUBY_ENGINE == "ruby" desc = RUBY_DESCRIPTION[/\Aruby #{Regexp.quote(RUBY_VERSION)}([^ ]+) /, 1] else desc = RUBY_DESCRIPTION[/\A#{RUBY_ENGINE} #{Regexp.quote(RUBY_ENGINE_VERSION)} \(#{RUBY_VERSION}([^ ]+)\) /, 1] end version << ".#{desc}" if desc end @ruby_version = Gem::Version.new version end
当前运行的 Ruby 的 Gem::Version。 (A Gem::Version for the currently running Ruby.)
Source
# File lib/rubygems.rb, line 967 def self.rubygems_version return @rubygems_version if defined? @rubygems_version @rubygems_version = Gem::Version.new Gem::VERSION end
当前运行的 RubyGems 的 Gem::Version。 (A Gem::Version for the currently running RubyGems)
Source
# File lib/rubygems.rb, line 444 def self.set_target_rbconfig(rbconfig_path) @target_rbconfig = Gem::TargetRbConfig.from_path(rbconfig_path) Gem::Platform.local(refresh: true) Gem.platforms << Gem::Platform.local unless Gem.platforms.include? Gem::Platform.local @target_rbconfig end
Source
# File lib/rubygems.rb, line 1091 def self.solaris_platform? RUBY_PLATFORM.include?("solaris") end
此平台是 Solaris 吗? (Is this platform Solaris?)
Source
# File lib/rubygems.rb, line 1232 def self.source_date_epoch Time.at(source_date_epoch_string.to_i).utc.freeze end
返回 Gem.source_date_epoch_string 的值,类型为 Time 对象。 (Returns the value of Gem.source_date_epoch_string, as a Time object.)
这在 RubyGems 中用于启用可重现的构建。 (This is used throughout RubyGems for enabling reproducible builds.)
Source
# File lib/rubygems.rb, line 1216 def self.source_date_epoch_string specified_epoch = ENV["SOURCE_DATE_EPOCH"] # If it's empty or just whitespace, treat it like it wasn't set at all. specified_epoch = nil if !specified_epoch.nil? && specified_epoch.strip.empty? epoch = specified_epoch || DEFAULT_SOURCE_DATE_EPOCH.to_s epoch.strip end
如果设置了 SOURCE_DATE_EPOCH 环境变量,则返回其值。否则,返回 DEFAULT_SOURCE_DATE_EPOCH 作为字符串。 (If the SOURCE_DATE_EPOCH environment variable is set, returns it’s value. Otherwise, returns DEFAULT_SOURCE_DATE_EPOCH as a string.)
注意 (@duckinator):实现有点奇怪,因为我们想要 (NOTE(@duckinator): The implementation is a tad weird because we want a)
1. Make builds reproducible by default, by having this function always return the same result during a given run. 2. Allow changing ENV['SOURCE_DATE_EPOCH'] at runtime, since multiple tests that set this variable will be run in a single process.
如果简化此函数并且大量测试失败,那很可能是由于上面的 #2。 (If you simplify this function and a lot of tests fail, that is likely due to #2 above.)
SOURCE_DATE_EPOCH 的详细信息: reproducible-builds.org/specs/source-date-epoch/ (Details on SOURCE_DATE_EPOCH: reproducible-builds.org/specs/source-date-epoch/)
Source
# File lib/rubygems.rb, line 976 def self.sources source_list = configuration.sources || default_sources @sources ||= Gem::SourceList.from(source_list) end
返回从中获取远程 gem 的源的 Array。如果源列表为空,则使用 default_sources。 (Returns an Array of sources to fetch remote gems from. Uses default_sources if the sources list is empty.)
Source
# File lib/rubygems.rb, line 988 def self.sources=(new_sources) if !new_sources @sources = nil else @sources = Gem::SourceList.from(new_sources) end end
需要能够设置源而不调用 Gem.sources.replace,因为这会导致无限循环。 (Need to be able to set the sources without calling Gem.sources.replace since that would cause an infinite loop.)
DOC:此注释不是关于方法本身的文档,而是关于实现的注释。 (DOC: This comment is not documentation about the method itself, it’s more of a code comment about the implementation.)
Source
# File lib/rubygems.rb, line 430 def self.spec_cache_dir paths.spec_cache_dir end
Source
# File lib/rubygems/defaults.rb, line 140 def self.state_file @state_file ||= File.join(Gem.state_home, "gem", "last_update_check") end
用户状态文件的标准位置路径。 (The path to standard location of the user’s state file.)
Source
# File lib/rubygems/defaults.rb, line 161 def self.state_home @state_home ||= ENV["XDG_STATE_HOME"] || File.join(Gem.user_home, ".local", "state") end
用户状态目录的标准位置路径。 (The path to standard location of the user’s state directory.)
Source
# File lib/rubygems.rb, line 999 def self.suffix_pattern @suffix_pattern ||= "{#{suffixes.join(",")}}" end
可加载路径后缀的 Glob 模式。 (Glob pattern for require-able path suffixes.)
Source
# File lib/rubygems.rb, line 1006 def self.suffix_regexp @suffix_regexp ||= /#{Regexp.union(suffixes)}\z/ end
可加载路径后缀的 Regexp。 (Regexp for require-able path suffixes.)
Source
# File lib/rubygems.rb, line 1027 def self.suffixes @suffixes ||= ["", ".rb", *%w[DLEXT DLEXT2].map do |key| val = RbConfig::CONFIG[key] next unless val && !val.empty? ".#{val}" end].compact.uniq end
可加载路径的后缀。 (Suffixes for require-able paths.)
Source
# File lib/rubygems.rb, line 440 def self.target_rbconfig @target_rbconfig || Gem::TargetRbConfig.for_running_ruby end
Source
# File lib/rubygems.rb, line 1048 def self.time(msg, width = 0, display = Gem.configuration.verbose) now = Time.now value = yield elapsed = Time.now - now ui.say format("%2$*1$s: %3$3.3fs", -width, msg, elapsed) if display value end
使用调试 UI 输出打印提供块运行所需的时间。 (Prints the amount of time the supplied block takes to run using the debug UI output.)
Source
# File lib/rubygems.rb, line 181 def self.try_activate(path) # finds the _latest_ version... regardless of loaded specs and their deps # if another gem had a requirement that would mean we shouldn't # activate the latest version, then either it would already be activated # or if it was ambiguous (and thus unresolved) the code in our custom # require will try to activate the more specific version. spec = Gem::Specification.find_by_path path return false unless spec return true if spec.activated? begin spec.activate rescue Gem::LoadError => e # this could fail due to gem dep collisions, go lax spec_by_name = Gem::Specification.find_by_name(spec.name) if spec_by_name.nil? raise e else spec_by_name.activate end end true end
尝试激活包含 path 的 gem。如果激活成功或因已激活而无需激活,则返回 true。如果找不到 gem 中的路径,则返回 false。 (Try to activate a gem containing path. Returns true if activation succeeded or wasn’t needed because it was already activated. Returns false if it can’t find the path in a gem.)
Source
# File lib/rubygems.rb, line 1063 def self.ui require_relative "rubygems/user_interaction" Gem::DefaultUserInteraction.ui end
延迟加载 DefaultUserInteraction 并返回默认 UI。 (Lazily loads DefaultUserInteraction and returns the default UI.)
Source
# File lib/rubygems.rb, line 1157 def self.use_gemdeps(path = nil) raise_exception = path path ||= ENV["RUBYGEMS_GEMDEPS"] return unless path path = path.dup if path == "-" Gem::Util.traverse_parents Dir.pwd do |directory| dep_file = GEM_DEP_FILES.find {|f| File.file?(f) } next unless dep_file path = File.join directory, dep_file break end end unless File.file? path return unless raise_exception raise ArgumentError, "Unable to find gem dependencies file at #{path}" end ENV["BUNDLE_GEMFILE"] ||= File.expand_path(path) require_relative "rubygems/user_interaction" require "bundler" begin Gem::DefaultUserInteraction.use_ui(ui) do Bundler.ui.silence do @gemdeps = Bundler.setup end ensure Gem::DefaultUserInteraction.ui.close end rescue Bundler::BundlerError => e warn e.message warn "You may need to `bundle install` to install missing gems" warn "" end end
在 path 查找 gem 依赖文件,如果找到则激活文件中的 gem。如果未找到文件,则引发 ArgumentError。 (Looks for a gem dependency file at path and activates the gems in the file if found. If the file is not found an ArgumentError is raised.)
如果未给出 path,则使用 RUBYGEMS_GEMDEPS 环境变量,但如果未找到文件,则不会引发异常。 (If path is not given the RUBYGEMS_GEMDEPS environment variable is used, but if no file is found no exception is raised.)
如果为 path 给出 ‘-’,则 RubyGems 会从当前工作目录向上搜索 gem 依赖文件(gem.deps.rb, Gemfile, Isolate)并激活找到的第一个文件中的 gem。 (If ‘-’ is given for path RubyGems searches up from the current working directory for gem dependency files (gem.deps.rb, Gemfile, Isolate) and activates the gems in the first one found.)
您可以在 RubyGems 启动时自动运行此功能。要启用,请将 RUBYGEMS_GEMDEPS 环境变量设置为您的 gem 依赖文件路径或 “-” 以在父目录中自动发现。 (You can run this automatically when rubygems starts. To enable, set the RUBYGEMS_GEMDEPS environment variable to either the path of your gem dependencies file or “-” to auto-discover in parent directories.)
注意:在多用户系统上启用自动发现可能导致在不受控制的目录中执行任意代码。 (NOTE: Enabling automatic discovery on multiuser systems can lead to execution of arbitrary code when used from directories outside your control.)
Source
# File lib/rubygems.rb, line 1073 def self.use_paths(home, *paths) paths.flatten! paths.compact! hash = { "GEM_HOME" => home, "GEM_PATH" => paths.empty? ? home : paths.join(File::PATH_SEPARATOR) } hash.delete_if {|_, v| v.nil? } self.paths = hash end
Source
# File lib/rubygems/defaults.rb, line 103 def self.user_dir gem_dir = File.join(Gem.user_home, ".gem") gem_dir = File.join(Gem.data_home, "gem") unless File.exist?(gem_dir) parts = [gem_dir, ruby_engine] parts << RbConfig::CONFIG["ruby_version"] unless RbConfig::CONFIG["ruby_version"].empty? File.join parts end
用户主目录中的 gem 路径 (Path for gems in the user’s home directory)
Source
# File lib/rubygems/defaults.rb, line 96 def self.user_home @user_home ||= find_home end
用户的家目录。 (The home directory for the user.)
Source
# File lib/rubygems/win_platform.rb, line 23 def self.win_platform? if @@win_platform.nil? ruby_platform = RbConfig::CONFIG["host_os"] @@win_platform = !WIN_PATTERNS.find {|r| ruby_platform =~ r }.nil? end @@win_platform end
这是 Windows 平台吗? (Is this a windows platform?)
Source
# File lib/rubygems.rb, line 838 def self.write_binary(path, data) File.binwrite(path, data) rescue Errno::ENOSPC # If we ran out of space but the file exists, it's *guaranteed* to be corrupted. File.delete(path) if File.exist?(path) raise end
在所有平台上以二进制模式安全地写入文件。 (Safely write a file in binary mode on all platforms.)
私有类方法
Source
# File lib/rubygems.rb, line 1368 def already_loaded?(file) $LOADED_FEATURES.any? do |feature_path| feature_path.end_with?(file) && default_gem_load_paths.any? {|load_path_entry| feature_path == "#{load_path_entry}/#{file}" } end end
Source
# File lib/rubygems.rb, line 1374 def default_gem_load_paths @default_gem_load_paths ||= $LOAD_PATH[load_path_insert_index..-1].map do |lp| expanded = File.expand_path(lp) next expanded unless File.exist?(expanded) File.realpath(expanded) end end
Source
# File lib/rubygems.rb, line 236 def self.find_and_activate_spec_for_exe(name, exec_name, requirements) spec = find_spec_for_exe name, exec_name, requirements Gem::LOADED_SPECS_MUTEX.synchronize do spec.activate finish_resolve end spec end
Source
# File lib/rubygems/defaults.rb, line 81 def self.find_home Dir.home.dup rescue StandardError if Gem.win_platform? File.expand_path File.join(ENV["HOMEDRIVE"] || ENV["SystemDrive"], "/") else File.expand_path "/" end end
查找用户的家目录。 (Finds the user’s home directory.)
Source
# File lib/rubygems.rb, line 246 def self.find_spec_for_exe(name, exec_name, requirements) raise ArgumentError, "you must supply exec_name" unless exec_name dep = Gem::Dependency.new name, requirements loaded = Gem.loaded_specs[name] return loaded if loaded && dep.matches_spec?(loaded) specs = dep.matching_specs(true) specs = specs.find_all do |spec| spec.executables.include? exec_name end if exec_name unless spec = specs.first msg = "can't find gem #{dep} with executable #{exec_name}" raise Gem::GemNotFoundException, msg end spec end