module Bundler
Bundler bietet eine konsistente Umgebung für Ruby-Projekte, indem die exakt benötigten Gems und Versionen verfolgt und installiert werden.
Bundler ist Teil der Ruby-Standardbibliothek.
Bundler wird durch das Erstellen von Gemfiles verwendet, die alle Projekt-Abhängigkeiten und (optional) ihre Versionen auflisten, und dann durch
require 'bundler/setup'
oder Bundler.setup zur Einrichtung einer Umgebung, in der nur die angegebenen Gems und ihre angegebenen Versionen verwendet werden können.
Weitere umfangreiche Dokumentationen zur Erstellung von Gemfiles und zur Verwendung von Bundler finden Sie auf der Bundler-Website.
Als Standardbibliothek innerhalb eines Projekts kann Bundler zur Introspektion von geladenen und angeforderten Modulen verwendet werden.
Constants
- ORIGINAL_ENV
- SUDO_MUTEX
Öffentliche Klassenmethoden
Source
# File lib/bundler.rb, line 341 def app_cache(custom_path = nil) path = custom_path || root Pathname.new(path).join(Bundler.settings.app_cache_path) end
Source
# File lib/bundler.rb, line 327 def app_config_path if app_config = ENV["BUNDLE_APP_CONFIG"] app_config_pathname = Pathname.new(app_config) if app_config_pathname.absolute? app_config_pathname else app_config_pathname.expand_path(root) end else root.join(".bundle") end end
Source
# File lib/bundler.rb, line 181 def auto_install return unless Bundler.settings[:auto_install] begin definition.specs rescue GemNotFound, GitError ui.info "Automatically installing missing gems." reset! CLI::Install.new({}).run reset! end end
Installiert automatisch Abhängigkeiten, wenn settings vorhanden ist. Dies wird über den Befehl `bundle config set –global auto_install 1` gesetzt.
Beachten Sie, dass diese Methode das globale Definitionsobjekt auf `nil` setzt. Sie sollte daher zuerst aufgerufen werden, bevor etwas wie ein `Installer` instanziiert wird, der eine Referenz auf das alte behält.
Source
# File lib/bundler.rb, line 171 def auto_switch self_manager.restart_with_locked_bundler_if_needed end
Source
# File lib/bundler.rb, line 119 def bin_path @bin_path ||= begin path = Bundler.settings[:bin] || "bin" path = Pathname.new(path).expand_path(root).expand_path mkdir_p(path) path end end
Gibt den absoluten Speicherort zurück, an dem Binstubs installiert werden.
Source
# File lib/bundler.rb, line 101 def bundle_path @bundle_path ||= Pathname.new(configured_bundle_path.path).expand_path(root) end
Gibt den absoluten Pfad zurück, an dem Gems auf dem Dateisystem installiert sind.
Source
# File lib/bundler.rb, line 366 def clean_env removed_message = "`Bundler.clean_env` has been removed in favor of `Bundler.unbundled_env`. " \ "If you instead want the environment before bundler was originally loaded, use `Bundler.original_env`" Bundler::SharedHelpers.feature_removed!(removed_message) end
Source
# File lib/bundler.rb, line 422 def clean_exec(*args) removed_message = "`Bundler.clean_exec` has been removed in favor of `Bundler.unbundled_exec`. " \ "If you instead want to exec to a command in the environment before bundler was originally loaded, use `Bundler.original_exec`" Bundler::SharedHelpers.feature_removed!(removed_message) end
Source
# File lib/bundler.rb, line 405 def clean_system(*args) removed_message = "`Bundler.clean_system` has been removed in favor of `Bundler.unbundled_system`. " \ "If you instead want to run the command in the environment before bundler was originally loaded, use `Bundler.original_system`" Bundler::SharedHelpers.feature_removed!(removed_message) end
Source
# File lib/bundler.rb, line 538 def clear_gemspec_cache @gemspec_cache = {} end
Source
# File lib/bundler.rb, line 87 def configure @configure ||= configure_gem_home_and_path end
Source
# File lib/bundler.rb, line 583 def configure_gem_home_and_path(path = bundle_path) configure_gem_path configure_gem_home(path) Bundler.rubygems.clear_paths end
Source
# File lib/bundler.rb, line 114 def configured_bundle_path @configured_bundle_path ||= Bundler.settings.path.tap(&:validate!) end
Source
# File lib/bundler.rb, line 105 def create_bundle_path mkdir_p(bundle_path) unless bundle_path.exist? @bundle_path = bundle_path.realpath rescue Errno::EEXIST raise PathError, "Could not install to path `#{bundle_path}` " \ "because a file already exists at that path. Either remove or rename the file so the directory can be created." end
Source
# File lib/bundler.rb, line 451 def default_bundle_dir SharedHelpers.default_bundle_dir end
Source
# File lib/bundler.rb, line 443 def default_gemfile SharedHelpers.default_gemfile end
Source
# File lib/bundler.rb, line 447 def default_lockfile SharedHelpers.default_lockfile end
Source
# File lib/bundler.rb, line 230 def definition(unlock = nil, lockfile = default_lockfile) @definition = nil if unlock @definition ||= begin configure Definition.build(default_gemfile, lockfile, unlock) end end
Gibt eine Instanz von Bundler::Definition für den gegebenen Gemfile und Lockfile zurück.
@param unlock [Hash, Boolean, nil] Angeforderte Gems.
to be updated or true if all gems should be updated
@param lockfile [Pathname] Pfad zur Gemfile.lock @return [Bundler::Definition]
Source
# File lib/bundler.rb, line 220 def environment SharedHelpers.feature_removed! "Bundler.environment has been removed in favor of Bundler.load" end
Source
# File lib/bundler.rb, line 547 def feature_flag @feature_flag ||= FeatureFlag.new(Bundler.settings[:simulate_version] || VERSION) end
Source
# File lib/bundler.rb, line 492 def find_executable(path) extensions = RbConfig::CONFIG["EXECUTABLE_EXTS"]&.split extensions = [RbConfig::CONFIG["EXEEXT"]] unless extensions&.any? candidates = extensions.map {|ext| "#{path}#{ext}" } candidates.find {|candidate| File.file?(candidate) && File.executable?(candidate) } end
Source
# File lib/bundler.rb, line 238 def frozen_bundle? frozen = Bundler.settings[:frozen] return frozen unless frozen.nil? Bundler.settings[:deployment] end
Source
# File lib/bundler.rb, line 439 def generic_local_platform Gem::Platform.generic(local_platform) end
Source
# File lib/bundler.rb, line 542 def git_present? return @git_present if defined?(@git_present) @git_present = Bundler.which("git") end
Source
# File lib/bundler.rb, line 519 def load_gemspec(file, validate = false) @gemspec_cache ||= {} key = File.expand_path(file) @gemspec_cache[key] ||= load_gemspec_uncached(file, validate) # Protect against caching side-effected gemspecs by returning a # new instance each time. @gemspec_cache[key]&.dup end
Source
# File lib/bundler.rb, line 528 def load_gemspec_uncached(file, validate = false) path = Pathname.new(file) contents = read_file(file) spec = eval_gemspec(path, contents) return unless spec spec.loaded_from = path.expand_path.to_s Bundler.rubygems.validate(spec) if validate spec end
Source
# File lib/bundler.rb, line 434 def local_platform return Gem::Platform::RUBY if Bundler.settings[:force_ruby_platform] Gem::Platform.local end
Source
# File lib/bundler.rb, line 245 def locked_gems @locked_gems ||= if defined?(@definition) && @definition definition.locked_gems elsif Bundler.default_lockfile.file? lock = Bundler.read_file(Bundler.default_lockfile) LockfileParser.new(lock) end end
Source
# File lib/bundler.rb, line 472 def mkdir_p(path) SharedHelpers.filesystem_access(path, :create) do |p| FileUtils.mkdir_p(p) end end
Source
# File lib/bundler.rb, line 362 def original_env ORIGINAL_ENV.clone end
@return [Hash] Umgebung, die vor der Aktivierung von Bundler vorhanden war.
Source
# File lib/bundler.rb, line 418 def original_exec(*args) with_original_env { Kernel.exec(*args) } end
Führt einen `Kernel.exec` für einen Unterbefehl mit der Umgebung aus, die vor der Aktivierung von Bundler vorhanden war.
Source
# File lib/bundler.rb, line 401 def original_system(*args) with_original_env { Kernel.system(*args) } end
Führt einen Unterbefehl mit der Umgebung aus, die vor der Aktivierung von Bundler vorhanden war.
Source
# File lib/bundler.rb, line 464 def preferred_gemfile_name Bundler.settings[:init_gems_rb] ? "gems.rb" : "Gemfile" end
Source
# File lib/bundler.rb, line 500 def read_file(file) SharedHelpers.filesystem_access(file, :read) do File.open(file, "r:UTF-8", &:read) end end
Source
# File lib/bundler.rb, line 212 def require(*groups) setup(*groups).require(*groups) end
Richtet die Bundler-Umgebung ein (siehe Bundler.setup), falls sie noch nicht eingerichtet ist, und lädt alle Gems aus den angegebenen Gruppen. Im Gegensatz zu ::setup kann sie mehrmals mit unterschiedlichen Gruppen aufgerufen werden (sofern diese durch `setup` erlaubt sind).
Annahme Gemfile
gem 'first_gem', '= 1.0' group :test do gem 'second_gem', '= 1.0' end
Der Code funktioniert wie folgt.
Bundler.setup # allow all groups Bundler.require(:default) # requires only first_gem # ...later Bundler.require(:test) # requires second_gem
Source
# File lib/bundler.rb, line 551 def reset! reset_paths! Plugin.reset! reset_rubygems! end
Source
# File lib/bundler.rb, line 562 def reset_paths! @bin_path = nil @bundle_path = nil @configure = nil @configured_bundle_path = nil @definition = nil @load = nil @locked_gems = nil @root = nil @settings = nil @setup = nil @user_home = nil end
Source
# File lib/bundler.rb, line 576 def reset_rubygems! return unless defined?(@rubygems) && @rubygems rubygems.undo_replacements rubygems.reset @rubygems = nil end
Source
# File lib/bundler.rb, line 557 def reset_settings_and_root! @settings = nil @root = nil end
Source
# File lib/bundler.rb, line 351 def rm_rf(path) FileUtils.remove_entry_secure(path) if path && File.exist?(path) end
Source
# File lib/bundler.rb, line 317 def root @root ||= begin SharedHelpers.root rescue GemfileNotFound bundle_dir = default_bundle_dir raise GemfileNotFound, "Could not locate Gemfile or .bundle/ directory" unless bundle_dir Pathname.new(File.expand_path("..", bundle_dir)) end end
Source
# File lib/bundler.rb, line 255 def ruby_scope "#{Bundler.rubygems.ruby_engine}/#{RbConfig::CONFIG["ruby_version"]}" end
Source
# File lib/bundler.rb, line 506 def safe_load_marshal(data) if Gem.respond_to?(:load_safe_marshal) Gem.load_safe_marshal begin Gem::SafeMarshal.safe_load(data) rescue Gem::SafeMarshal::Reader::Error, Gem::SafeMarshal::Visitors::ToRuby::Error => e raise MarshalError, "#{e.class}: #{e.message}" end else load_marshal(data, marshal_proc: SafeMarshal.proc) end end
Source
# File lib/bundler.rb, line 589 def self_manager @self_manager ||= begin require_relative "bundler/self_manager" Bundler::SelfManager.new end end
Source
# File lib/bundler.rb, line 355 def settings @settings ||= Settings.new(app_config_path) rescue GemfileNotFound @settings = Settings.new end
Source
# File lib/bundler.rb, line 155 def setup(*groups) # Return if all groups are already loaded return @setup if defined?(@setup) && @setup definition.validate_runtime! SharedHelpers.print_major_deprecations! if groups.empty? # Load all groups, but only once @setup = load.setup else load.setup(*groups) end end
Schaltet die Bundler-Laufzeitumgebung ein. Nach dem Aufruf von Bundler.setup sind alle `load` oder `require` von Gems nur zulässig, wenn sie Teil des Gemfiles oder der Ruby-Standardbibliothek sind. Wenn Versionen im Gemfile angegeben sind, werden nur diese Versionen geladen.
Annahme Gemfile
gem 'first_gem', '= 1.0' group :test do gem 'second_gem', '= 1.0' end
Der Code, der Bundler.setup verwendet, funktioniert wie folgt:
require 'third_gem' # allowed, required from global gems require 'first_gem' # allowed, loads the last installed version Bundler.setup require 'fourth_gem' # fails with LoadError require 'second_gem' # loads exactly version 1.0
Bundler.setup kann nur einmal aufgerufen werden, alle nachfolgenden Aufrufe sind wirkungslos.
Wenn eine Liste von `groups` bereitgestellt wird, sind nur Gems aus den angegebenen Gruppen zulässig (Gems, die außerhalb von Gruppen angegeben sind, gehören zur speziellen Gruppe `:default`).
Um alle Gems aus dem Gemfile (oder nur einige Gruppen) zu laden, siehe Bundler.require.
Source
# File lib/bundler.rb, line 313 def specs_path bundle_path.join("specifications") end
Source
# File lib/bundler.rb, line 455 def system_bindir # Gem.bindir doesn't always return the location that RubyGems will install # system binaries. If you put '-n foo' in your .gemrc, RubyGems will # install binstubs there instead. Unfortunately, RubyGems doesn't expose # that directory at all, so rather than parse .gemrc ourselves, we allow # the directory to be set as well, via `bundle config set --local bindir foo`. Bundler.settings[:system_bindir] || Bundler.rubygems.gem_bindir end
Source
# File lib/bundler.rb, line 346 def tmp(name = Process.pid.to_s) Kernel.send(:require, "tmpdir") Pathname.new(Dir.mktmpdir(["bundler", name])) end
Source
# File lib/bundler.rb, line 91 def ui (defined?(@ui) && @ui) || (self.ui = UI::Shell.new) end
Source
# File lib/bundler.rb, line 95 def ui=(ui) Bundler.rubygems.ui = UI::RGProxy.new(ui) @ui = ui end
Source
# File lib/bundler.rb, line 379 def unbundle_env! ENV.replace(unbundle_env(ENV)) end
Entfernt alle Bundler-bezogenen Variablen aus ENV.
Source
# File lib/bundler.rb, line 374 def unbundled_env unbundle_env(original_env) end
@return [Hash] Umgebung mit allen entfernten Bundler-bezogenen Variablen.
Source
# File lib/bundler.rb, line 430 def unbundled_exec(*args) with_env(unbundled_env) { Kernel.exec(*args) } end
Führt einen `Kernel.exec` für einen Unterbefehl in einer Umgebung aus, in der alle Bundler-bezogenen Variablen entfernt wurden.
Source
# File lib/bundler.rb, line 413 def unbundled_system(*args) with_unbundled_env { Kernel.system(*args) } end
Führt einen Unterbefehl in einer Umgebung aus, in der alle Bundler-bezogenen Variablen entfernt wurden.
Source
# File lib/bundler.rb, line 468 def use_system_gems? configured_bundle_path.use_system_gems? end
Source
# File lib/bundler.rb, line 283 def user_bundle_path(dir = "home") env_var, fallback = case dir when "home" ["BUNDLE_USER_HOME", proc { Pathname.new(user_home).join(".bundle") }] when "cache" ["BUNDLE_USER_CACHE", proc { user_bundle_path.join("cache") }] when "config" ["BUNDLE_USER_CONFIG", proc { user_bundle_path.join("config") }] when "plugin" ["BUNDLE_USER_PLUGIN", proc { user_bundle_path.join("plugin") }] else raise BundlerError, "Unknown user path requested: #{dir}" end # `fallback` will already be a Pathname, but Pathname.new() is # idempotent so it's OK Pathname.new(ENV.fetch(env_var, &fallback)) end
Source
# File lib/bundler.rb, line 259 def user_home @user_home ||= begin home = Bundler.rubygems.user_home bundle_home = home ? File.join(home, ".bundle") : nil warning = if home.nil? "Your home directory is not set." elsif !File.directory?(home) "`#{home}` is not a directory." elsif !File.writable?(home) && (!File.directory?(bundle_home) || !File.writable?(bundle_home)) "`#{home}` is not writable." end if warning Bundler.ui.warn "#{warning}\n" user_home = tmp_home_path Bundler.ui.warn "Bundler will use `#{user_home}' as your home directory temporarily.\n" user_home else Pathname.new(home) end end end
Source
# File lib/bundler.rb, line 478 def which(executable) executable_path = find_executable(executable) return executable_path if executable_path if (paths = ENV["PATH"]) quote = '"' paths.split(File::PATH_SEPARATOR).find do |path| path = path[1..-2] if path.start_with?(quote) && path.end_with?(quote) executable_path = find_executable(File.expand_path(executable, path)) return executable_path if executable_path end end end
Source
# File lib/bundler.rb, line 388 def with_clean_env removed_message = "`Bundler.with_clean_env` has been removed in favor of `Bundler.with_unbundled_env`. " \ "If you instead want the environment before bundler was originally loaded, use `Bundler.with_original_env`" Bundler::SharedHelpers.feature_removed!(removed_message) end
Source
# File lib/bundler.rb, line 384 def with_original_env with_env(original_env) { yield } end
Führt den Block mit der Umgebung aus, die vor der Aktivierung von Bundler vorhanden war.
Source
# File lib/bundler.rb, line 396 def with_unbundled_env with_env(unbundled_env) { yield } end
Führt den Block mit allen entfernten Bundler-bezogenen Variablen aus.
Private Klassenmethoden
Source
# File lib/bundler.rb, line 659 def configure_gem_home(path) Bundler::SharedHelpers.set_env "GEM_HOME", path.to_s end
Source
# File lib/bundler.rb, line 650 def configure_gem_path unless use_system_gems? # this needs to be empty string to cause # PathSupport.split_gem_path to only load up the # Bundler --path setting as the GEM_PATH. Bundler::SharedHelpers.set_env "GEM_PATH", "" end end
Source
# File lib/bundler.rb, line 634 def eval_gemspec(path, contents) if contents.start_with?("---") # YAML header eval_yaml_gemspec(path, contents) else # Eval the gemspec from its parent directory, because some gemspecs # depend on "./" relative paths. SharedHelpers.chdir(path.dirname.to_s) do eval(contents, TOPLEVEL_BINDING.dup, path.expand_path.to_s) end end rescue ScriptError, StandardError => e msg = "There was an error while loading `#{path.basename}`: #{e.message}" raise GemspecError, Dsl::DSLError.new(msg, path.to_s, e.backtrace, contents) end
Source
# File lib/bundler.rb, line 628 def eval_yaml_gemspec(path, contents) Kernel.require "psych" Gem::Specification.from_yaml(contents) end
Source
# File lib/bundler.rb, line 622 def load_marshal(data, marshal_proc: nil) Marshal.load(data, marshal_proc) rescue TypeError => e raise MarshalError, "#{e.class}: #{e.message}" end
Source
# File lib/bundler.rb, line 663 def tmp_home_path Kernel.send(:require, "tmpdir") SharedHelpers.filesystem_access(Dir.tmpdir) do path = Bundler.tmp at_exit { Bundler.rm_rf(path) } path end end
Source
# File lib/bundler.rb, line 598 def unbundle_env(env) if env.key?("BUNDLER_ORIG_MANPATH") env["MANPATH"] = env["BUNDLER_ORIG_MANPATH"] end env.delete_if {|k, _| k[0, 7] == "BUNDLE_" } env.delete("BUNDLER_SETUP") if env.key?("RUBYOPT") rubyopt = env["RUBYOPT"].split(" ") rubyopt.delete("-r#{File.expand_path("bundler/setup", __dir__)}") rubyopt.delete("-rbundler/setup") env["RUBYOPT"] = rubyopt.join(" ") end if env.key?("RUBYLIB") rubylib = env["RUBYLIB"].split(File::PATH_SEPARATOR) rubylib.delete(__dir__) env["RUBYLIB"] = rubylib.join(File::PATH_SEPARATOR) end env end
Source
# File lib/bundler.rb, line 673 def with_env(env) backup = ENV.to_hash ENV.replace(env) yield ensure ENV.replace(backup) end
@param env [Hash]