Bundler
provides a consistent environment for Ruby projects by tracking and installing the exact gems and versions that are needed.
Bundler
is a part of Rubyâs standard library.
Bundler
is used by creating gemfiles listing all the project dependencies and (optionally) their versions and then using
require 'bundler/setup'
or Bundler.setup
to setup environment where only specified gems and their specified versions could be used.
See Bundler website for extensive documentation on gemfiles creation and Bundler
usage.
As a standard library inside project, Bundler
could be used for introspection of loaded and required modules.
def app_cache(custom_path = nil) path = custom_path || root Pathname.new(path).join(settings.app_cache_path) endSource
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 endSource
def auto_install return unless settings[:auto_install] begin definition.specs rescue GemNotFound, GitError ui.info "Automatically installing missing gems." reset! CLI::Install.new({}).run reset! end end
Automatically install dependencies if Bundler.settings[:auto_install]
exists. This is set through config cmd âbundle config set âglobal auto_install
1`.
Note that this method ânil`s out the global Definition object, so it should be called first, before you instantiate anything like an `Installer` thatâll keep a reference to the old one instead.
Sourcedef auto_switch self_manager.restart_with_locked_bundler_if_needed endSource
def bin_path @bin_path ||= begin path = settings[:bin] || "bin" path = Pathname.new(path).expand_path(root).expand_path mkdir_p(path) path end end
Returns absolute location of where binstubs are installed to.
Sourcedef bundle_path @bundle_path ||= Pathname.new(configured_bundle_path.path).expand_path(root) end
Returns absolute path of where gems are installed on the filesystem.
Sourcedef clean_env message = "`Bundler.clean_env` has been deprecated in favor of `Bundler.unbundled_env`. " \ "If you instead want the environment before bundler was originally loaded, use `Bundler.original_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.major_deprecation(2, message, removed_message: removed_message, print_caller_location: true) unbundled_env end
@deprecated Use âunbundled_env` instead
Sourcedef clean_exec(*args) message = "`Bundler.clean_exec` has been deprecated 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`" 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.major_deprecation(2, message, removed_message: removed_message, print_caller_location: true) with_env(unbundled_env) { Kernel.exec(*args) } end
@deprecated Use âunbundled_exec` instead
Sourcedef clean_system(*args) message = "`Bundler.clean_system` has been deprecated 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`" 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.major_deprecation(2, message, removed_message: removed_message, print_caller_location: true) with_env(unbundled_env) { Kernel.system(*args) } end
@deprecated Use âunbundled_system` instead
Sourcedef clear_gemspec_cache @gemspec_cache = {} endSource
def configure @configure ||= configure_gem_home_and_path endSource
def configure_gem_home_and_path(path = bundle_path) configure_gem_path configure_gem_home(path) Bundler.rubygems.clear_paths endSource
def configured_bundle_path @configured_bundle_path ||= settings.path.tap(&:validate!) endSource
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." endSource
def default_bundle_dir SharedHelpers.default_bundle_dir endSource
def default_gemfile SharedHelpers.default_gemfile endSource
def default_lockfile SharedHelpers.default_lockfile endSource
def definition(unlock = nil, lockfile = default_lockfile) @definition = nil if unlock @definition ||= begin configure Definition.build(default_gemfile, lockfile, unlock) end end
Returns an instance of Bundler::Definition for given Gemfile and lockfile
@param unlock [Hash, Boolean, nil] Gems that have been requested
to be updated or true if all gems should be updated
@param lockfile [Pathname] Path to Gemfile.lock @return [Bundler::Definition]
Sourcedef environment SharedHelpers.major_deprecation 2, "Bundler.environment has been removed in favor of Bundler.load", print_caller_location: true load endSource
def feature_flag @feature_flag ||= FeatureFlag.new(VERSION) endSource
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) } endSource
def frozen_bundle? frozen = settings[:frozen] return frozen unless frozen.nil? settings[:deployment] endSource
def git_present? return @git_present if defined?(@git_present) @git_present = Bundler.which("git") endSource
def home bundle_path.join("bundler") endSource
def install_path home.join("gems") endSource
def load @load ||= Runtime.new(root, definition) endSource
def load_gemspec(file, validate = false) @gemspec_cache ||= {} key = File.expand_path(file) @gemspec_cache[key] ||= load_gemspec_uncached(file, validate) @gemspec_cache[key]&.dup endSource
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 endSource
def local_platform return Gem::Platform::RUBY if settings[:force_ruby_platform] Gem::Platform.local endSource
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 endSource
def mkdir_p(path) SharedHelpers.filesystem_access(path, :create) do |p| FileUtils.mkdir_p(p) end endSource
def original_env ORIGINAL_ENV.clone end
@return [Hash] Environment present before Bundler
was activated
def original_exec(*args) with_original_env { Kernel.exec(*args) } end
Run a âKernel.exec` to a subcommand with the environment present before Bundler
was activated
def original_system(*args) with_original_env { Kernel.system(*args) } end
Run subcommand with the environment present before Bundler
was activated
def preferred_gemfile_name Bundler.settings[:init_gems_rb] ? "gems.rb" : "Gemfile" endSource
def read_file(file) SharedHelpers.filesystem_access(file, :read) do File.open(file, "r:UTF-8", &:read) end endSource
def require(*groups) setup(*groups).require(*groups) end
Setups Bundler
environment (see Bundler.setup
) if it is not already set, and loads all gems from groups specified. Unlike ::setup
, can be called multiple times with different groups (if they were allowed by setup).
Assuming Gemfile
gem 'first_gem', '= 1.0' group :test do gem 'second_gem', '= 1.0' end
The code will work as follows:
Bundler.setup Bundler.require(:default) Bundler.require(:test)Source
def reset! reset_paths! Plugin.reset! reset_rubygems! endSource
def reset_paths! @bin_path = nil @bundler_major_version = 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 endSource
def reset_rubygems! return unless defined?(@rubygems) && @rubygems rubygems.undo_replacements rubygems.reset @rubygems = nil endSource
def reset_settings_and_root! @settings = nil @root = nil endSource
def rm_rf(path) FileUtils.remove_entry_secure(path) if path && File.exist?(path) endSource
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 endSource
def ruby_scope "#{Bundler.rubygems.ruby_engine}/#{RbConfig::CONFIG["ruby_version"]}" endSource
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 endSource
def self_manager @self_manager ||= begin require_relative "bundler/self_manager" Bundler::SelfManager.new end endSource
def settings @settings ||= Settings.new(app_config_path) rescue GemfileNotFound @settings = Settings.new endSource
def setup(*groups) return @setup if defined?(@setup) && @setup definition.validate_runtime! SharedHelpers.print_major_deprecations! if groups.empty? @setup = load.setup else load.setup(*groups) end end
Turns on the Bundler
runtime. After Bundler.setup
call, all load
or require
of the gems would be allowed only if they are part of the Gemfile or Rubyâs standard library. If the versions specified in Gemfile, only those versions would be loaded.
Assuming Gemfile
gem 'first_gem', '= 1.0' group :test do gem 'second_gem', '= 1.0' end
The code using Bundler.setup
works as follows:
require 'third_gem' require 'first_gem' Bundler.setup require 'fourth_gem' require 'second_gem'
Bundler.setup
can be called only once, all subsequent calls are no-op.
If groups list is provided, only gems from specified groups would be allowed (gems specified outside groups belong to special :default
group).
To require all gems from Gemfile (or only some groups), see Bundler.require
.
def specs_path bundle_path.join("specifications") endSource
def system_bindir Bundler.settings[:system_bindir] || Bundler.rubygems.gem_bindir endSource
def tmp(name = Process.pid.to_s) Kernel.send(:require, "tmpdir") Pathname.new(Dir.mktmpdir(["bundler", name])) endSource
def ui (defined?(@ui) && @ui) || (self.ui = UI::Shell.new) endSource
def ui=(ui) Bundler.rubygems.ui = UI::RGProxy.new(ui) @ui = ui endSource
def unbundle_env! ENV.replace(unbundle_env(ENV)) end
Remove all bundler-related variables from ENV
def unbundled_env unbundle_env(original_env) end
@return [Hash] Environment with all bundler-related variables removed
Sourcedef unbundled_exec(*args) with_env(unbundled_env) { Kernel.exec(*args) } end
Run a âKernel.exec` to a subcommand in an environment with all bundler related variables removed
Sourcedef unbundled_system(*args) with_unbundled_env { Kernel.system(*args) } end
Run subcommand in an environment with all bundler related variables removed
Sourcedef use_system_gems? configured_bundle_path.use_system_gems? endSource
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 Pathname.new(ENV.fetch(env_var, &fallback)) endSource
def user_cache user_bundle_path("cache") endSource
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 endSource
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 endSource
def with_clean_env message = "`Bundler.with_clean_env` has been deprecated in favor of `Bundler.with_unbundled_env`. " \ "If you instead want the environment before bundler was originally loaded, use `Bundler.with_original_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.major_deprecation(2, message, removed_message: removed_message, print_caller_location: true) with_env(unbundled_env) { yield } end
@deprecated Use âwith_unbundled_env` instead
Sourcedef with_original_env with_env(original_env) { yield } end
Run block with environment present before Bundler
was activated
def with_unbundled_env with_env(unbundled_env) { yield } end
Run block with all bundler-related variables removed
Private Class Methods Sourcedef configure_gem_home(path) Bundler::SharedHelpers.set_env "GEM_HOME", path.to_s endSource
def configure_gem_path unless use_system_gems? Bundler::SharedHelpers.set_env "GEM_PATH", "" end endSource
def eval_gemspec(path, contents) if contents.start_with?("---") eval_yaml_gemspec(path, contents) else 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) endSource
def eval_yaml_gemspec(path, contents) Kernel.require "psych" Gem::Specification.from_yaml(contents) endSource
def load_marshal(data, marshal_proc: nil) Marshal.load(data, marshal_proc) rescue TypeError => e raise MarshalError, "#{e.class}: #{e.message}" endSource
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 endSource
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 endSource
def with_env(env) backup = ENV.to_hash ENV.replace(env) yield ensure ENV.replace(backup) end
@param env [Hash]
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.3