Module: Bundler
- Defined in:
- lib/bundler/version.rb,
lib/bundler.rb,
lib/bundler/ui.rb,
lib/bundler/cli.rb,
lib/bundler/dsl.rb,
lib/bundler/env.rb,
lib/bundler/graph.rb,
lib/bundler/index.rb,
lib/bundler/retry.rb,
lib/bundler/errors.rb,
lib/bundler/mirror.rb,
lib/bundler/plugin.rb,
lib/bundler/source.rb,
lib/bundler/worker.rb,
lib/bundler/cli/add.rb,
lib/bundler/cli/gem.rb,
lib/bundler/cli/viz.rb,
lib/bundler/fetcher.rb,
lib/bundler/gemdeps.rb,
lib/bundler/runtime.rb,
lib/bundler/cli/exec.rb,
lib/bundler/cli/info.rb,
lib/bundler/cli/init.rb,
lib/bundler/cli/list.rb,
lib/bundler/cli/lock.rb,
lib/bundler/cli/open.rb,
lib/bundler/cli/show.rb,
lib/bundler/injector.rb,
lib/bundler/resolver.rb,
lib/bundler/ruby_dsl.rb,
lib/bundler/settings.rb,
lib/bundler/spec_set.rb,
lib/bundler/ui/shell.rb,
lib/bundler/cli/cache.rb,
lib/bundler/cli/check.rb,
lib/bundler/cli/clean.rb,
lib/bundler/cli/issue.rb,
lib/bundler/constants.rb,
lib/bundler/dep_proxy.rb,
lib/bundler/deprecate.rb,
lib/bundler/installer.rb,
lib/bundler/ui/silent.rb,
lib/bundler/cli/common.rb,
lib/bundler/cli/config.rb,
lib/bundler/cli/doctor.rb,
lib/bundler/cli/inject.rb,
lib/bundler/cli/plugin.rb,
lib/bundler/cli/remove.rb,
lib/bundler/cli/update.rb,
lib/bundler/definition.rb,
lib/bundler/dependency.rb,
lib/bundler/deployment.rb,
lib/bundler/gem_helper.rb,
lib/bundler/plugin/api.rb,
lib/bundler/plugin/dsl.rb,
lib/bundler/source/git.rb,
lib/bundler/cli/console.rb,
lib/bundler/cli/install.rb,
lib/bundler/cli/package.rb,
lib/bundler/gem_helpers.rb,
lib/bundler/source/path.rb,
lib/bundler/source_list.rb,
lib/bundler/ui/rg_proxy.rb,
lib/bundler/cli/binstubs.rb,
lib/bundler/cli/outdated.rb,
lib/bundler/cli/platform.rb,
lib/bundler/cli/pristine.rb,
lib/bundler/current_ruby.rb,
lib/bundler/feature_flag.rb,
lib/bundler/fetcher/base.rb,
lib/bundler/plugin/index.rb,
lib/bundler/process_lock.rb,
lib/bundler/psyched_yaml.rb,
lib/bundler/ruby_version.rb,
lib/bundler/fetcher/index.rb,
lib/bundler/plugin/events.rb,
lib/bundler/vendored_thor.rb,
lib/bundler/build_metadata.rb,
lib/bundler/match_platform.rb,
lib/bundler/shared_helpers.rb,
lib/bundler/source/gemspec.rb,
lib/bundler/version_ranges.rb,
lib/bundler/friendly_errors.rb,
lib/bundler/lockfile_parser.rb,
lib/bundler/source/metadata.rb,
lib/bundler/source/rubygems.rb,
lib/bundler/yaml_serializer.rb,
lib/bundler/plugin/installer.rb,
lib/bundler/plugin/api/source.rb,
lib/bundler/fetcher/dependency.rb,
lib/bundler/fetcher/downloader.rb,
lib/bundler/gem_remote_fetcher.rb,
lib/bundler/lazy_specification.rb,
lib/bundler/lockfile_generator.rb,
lib/bundler/plugin/source_list.rb,
lib/bundler/settings/validator.rb,
lib/bundler/stub_specification.rb,
lib/bundler/vendored_fileutils.rb,
lib/bundler/vendored_molinillo.rb,
lib/bundler/resolver/spec_group.rb,
lib/bundler/similarity_detector.rb,
lib/bundler/vendored_persistent.rb,
lib/bundler/vendored_persistent.rb,
lib/bundler/compact_index_client.rb,
lib/bundler/gem_version_promoter.rb,
lib/bundler/installer/standalone.rb,
lib/bundler/plugin/installer/git.rb,
lib/bundler/remote_specification.rb,
lib/bundler/rubygems_integration.rb,
lib/bundler/source/git/git_proxy.rb,
lib/bundler/environment_preserver.rb,
lib/bundler/fetcher/compact_index.rb,
lib/bundler/source/path/installer.rb,
lib/bundler/endpoint_specification.rb,
lib/bundler/rubygems_gem_installer.rb,
lib/bundler/source/rubygems/remote.rb,
lib/bundler/uri_credentials_filter.rb,
lib/bundler/installer/gem_installer.rb,
lib/bundler/plugin/installer/rubygems.rb,
lib/bundler/compact_index_client/cache.rb,
lib/bundler/compact_index_client/updater.rb,
lib/bundler/installer/parallel_installer.rb,
lib/bundler/ssl_certs/certificate_manager.rb
Overview
some Ruby builds don’t have OpenSSL
Defined Under Namespace
Modules: BuildMetadata, FileUtils, FriendlyErrors, GemHelpers, MatchPlatform, Molinillo, Persistent, Plugin, RubyDsl, SSLCerts, SharedHelpers, UI, URICredentialsFilter, VersionRanges, YAMLSerializer
Classes: APIResponseMismatchError, BundlerError, CLI, CompactIndexClient, CurrentRuby, CyclicDependencyError, Definition, DepProxy, Dependency, Deployment, Deprecate, DeprecatedError, Dsl, EndpointSpecification, Env, EnvironmentPreserver, FeatureFlag, Fetcher, GemHelper, GemInstaller, GemNotFound, GemRemoteFetcher, GemRequireError, GemVersionPromoter, Gemdeps, GemfileError, GemfileEvalError, GemfileLockNotFound, GemfileNotFound, GemspecError, GenericSystemCallError, GitError, Graph, HTTPError, Index, Injector, InstallError, InstallHookError, Installer, InvalidOption, LazySpecification, LockfileError, LockfileGenerator, LockfileParser, MarshalError, MirrorSockets, NoSpaceOnDeviceError, OperationNotSupportedError, ParallelInstaller, PathError, PermissionError, PersistentHTTP, PluginError, ProcessLock, ProductionError, RemoteSpecification, Resolver, Retry, RubyGemsGemInstaller, RubyVersion, RubyVersionMismatch, RubygemsIntegration, Runtime, SecurityError, Settings, SimilarityDetector, SocketAddress, Source, SourceList, SpecSet, Standalone, StubSpecification, SudoNotPermittedError, TemporaryResourceError, Thor, ThreadCreationError, VersionConflict, VirtualProtocolError, Worker, YamlSyntaxError
Constant Summary
collapse
- ORIGINAL_ENV =
environment_preserver.restore
- SUDO_MUTEX =
Mutex.new
- VERSION =
We’re doing this because we might write tests that deal with other versions of bundler and we are unsure how to handle this better.
"1.17.3"
- WINDOWS =
RbConfig::CONFIG["host_os"] =~ /(msdos|mswin|djgpp|mingw)/
- FREEBSD =
RbConfig::CONFIG["host_os"] =~ /bsd/
- NULL =
WINDOWS ? "NUL" : "/dev/null"
- YamlLibrarySyntaxError =
Syck raises ArgumentError
::ArgumentError
Class Method Summary
collapse
Class Method Details
.app_cache(custom_path = nil) ⇒ Object
250
251
252
253
|
# File 'lib/bundler.rb', line 250
def app_cache(custom_path = nil)
path = custom_path || root
Pathname.new(path).join(settings.app_cache_path)
end
|
.app_config_path ⇒ Object
242
243
244
245
246
247
248
|
# File 'lib/bundler.rb', line 242
def app_config_path
if app_config = ENV["BUNDLE_APP_CONFIG"]
Pathname.new(app_config).expand_path(root)
else
root.join(".bundle")
end
end
|
.bin_path ⇒ Object
Returns absolute location of where binstubs are installed to.
88
89
90
91
92
93
94
95
|
# File 'lib/bundler.rb', line 88
def bin_path
@bin_path ||= begin
path = settings[:bin] || "bin"
path = Pathname.new(path).expand_path(root).expand_path
SharedHelpers.filesystem_access(path) {|p| FileUtils.mkdir_p(p) }
path
end
end
|
.bundle_path ⇒ Object
Returns absolute path of where gems are installed on the filesystem.
79
80
81
|
# File 'lib/bundler.rb', line 79
def bundle_path
@bundle_path ||= Pathname.new(configured_bundle_path.path).expand_path(root)
end
|
.bundler_major_version ⇒ Object
25
26
27
|
# File 'lib/bundler/version.rb', line 25
def self.bundler_major_version
@bundler_major_version ||= VERSION.split(".").first.to_i
end
|
.clean_env ⇒ Hash
Deprecated.
Use ‘original_env` instead
Returns Environment with all bundler-related variables removed.
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
|
# File 'lib/bundler.rb', line 285
def clean_env
Bundler::SharedHelpers.major_deprecation(2, "`Bundler.clean_env` has weird edge cases, use `.original_env` instead")
env = original_env
if env.key?("BUNDLER_ORIG_MANPATH")
env["MANPATH"] = env["BUNDLER_ORIG_MANPATH"]
end
env.delete_if {|k, _| k[0, 7] == "BUNDLE_" }
if env.key?("RUBYOPT")
env["RUBYOPT"] = env["RUBYOPT"].sub "-rbundler/setup", ""
end
if env.key?("RUBYLIB")
rubylib = env["RUBYLIB"].split(File::PATH_SEPARATOR)
rubylib.delete(File.expand_path("..", __FILE__))
env["RUBYLIB"] = rubylib.join(File::PATH_SEPARATOR)
end
env
end
|
.clean_exec(*args) ⇒ Object
320
321
322
|
# File 'lib/bundler.rb', line 320
def clean_exec(*args)
with_clean_env { Kernel.exec(*args) }
end
|
.clean_system(*args) ⇒ Object
316
317
318
|
# File 'lib/bundler.rb', line 316
def clean_system(*args)
with_clean_env { Kernel.system(*args) }
end
|
.clear_gemspec_cache ⇒ Object
468
469
470
|
# File 'lib/bundler.rb', line 468
def clear_gemspec_cache
@gemspec_cache = {}
end
|
65
66
67
|
# File 'lib/bundler.rb', line 65
def configure
@configured ||= configure_gem_home_and_path
end
|
83
84
85
|
# File 'lib/bundler.rb', line 83
def configured_bundle_path
@configured_bundle_path ||= settings.path.tap(&:validate!)
end
|
Returns current version of Ruby
7
8
9
|
# File 'lib/bundler/current_ruby.rb', line 7
def self.current_ruby
@current_ruby ||= CurrentRuby.new
end
|
.default_bundle_dir ⇒ Object
.default_gemfile ⇒ Object
.default_lockfile ⇒ Object
Returns an instance of Bundler::Definition for given Gemfile and lockfile
131
132
133
134
135
136
137
|
# File 'lib/bundler.rb', line 131
def definition(unlock = nil)
@definition = nil if unlock
@definition ||= begin
configure
Definition.build(default_gemfile, default_lockfile, unlock)
end
end
|
.environment ⇒ Object
121
122
123
124
|
# File 'lib/bundler.rb', line 121
def environment
SharedHelpers.major_deprecation 2, "Bundler.environment has been removed in favor of Bundler.load"
load
end
|
.feature_flag ⇒ Object
477
478
479
|
# File 'lib/bundler.rb', line 477
def feature_flag
@feature_flag ||= FeatureFlag.new(VERSION)
end
|
.frozen_bundle? ⇒ Boolean
139
140
141
142
143
|
# File 'lib/bundler.rb', line 139
def frozen_bundle?
frozen = settings[:deployment]
frozen ||= settings[:frozen] unless feature_flag.deployment_means_frozen?
frozen
end
|
.git_present? ⇒ Boolean
472
473
474
475
|
# File 'lib/bundler.rb', line 472
def git_present?
return @git_present if defined?(@git_present)
@git_present = Bundler.which("git") || Bundler.which("git.exe")
end
|
.home ⇒ Object
220
221
222
|
# File 'lib/bundler.rb', line 220
def home
bundle_path.join("bundler")
end
|
.install_path ⇒ Object
224
225
226
|
# File 'lib/bundler.rb', line 224
def install_path
home.join("gems")
end
|
.load ⇒ Object
117
118
119
|
# File 'lib/bundler.rb', line 117
def load
@load ||= Runtime.new(root, definition)
end
|
.load_gemspec(file, validate = false) ⇒ Object
441
442
443
444
445
446
447
448
|
# File 'lib/bundler.rb', line 441
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 if @gemspec_cache[key]
end
|
.load_gemspec_uncached(file, validate = false) ⇒ Object
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
|
# File 'lib/bundler.rb', line 450
def load_gemspec_uncached(file, validate = false)
path = Pathname.new(file)
contents = read_file(file)
spec = if contents.start_with?("---") eval_yaml_gemspec(path, contents)
else
SharedHelpers.chdir(path.dirname.to_s) do
eval_gemspec(path, contents)
end
end
return unless spec
spec.loaded_from = path.expand_path.to_s
Bundler.rubygems.validate(spec) if validate
spec
end
|
.load_marshal(data) ⇒ Object
435
436
437
438
439
|
# File 'lib/bundler.rb', line 435
def load_marshal(data)
Marshal.load(data)
rescue StandardError => e
raise MarshalError, "#{e.class}: #{e.message}"
end
|
324
325
326
327
|
# File 'lib/bundler.rb', line 324
def local_platform
return Gem::Platform::RUBY if settings[:force_ruby_platform]
Gem::Platform.local
end
|
.mkdir_p(path, options = {}) ⇒ Object
382
383
384
385
386
387
388
389
390
|
# File 'lib/bundler.rb', line 382
def mkdir_p(path, options = {})
if requires_sudo? && !options[:no_sudo]
sudo "mkdir -p '#{path}'" unless File.exist?(path)
else
SharedHelpers.filesystem_access(path, :write) do |p|
FileUtils.mkdir_p(p)
end
end
end
|
.original_env ⇒ Hash
Returns Environment present before Bundler was activated.
279
280
281
|
# File 'lib/bundler.rb', line 279
def original_env
ORIGINAL_ENV.clone
end
|
.read_file(file) ⇒ Object
429
430
431
432
433
|
# File 'lib/bundler.rb', line 429
def read_file(file)
SharedHelpers.filesystem_access(file, :read) do
File.open(file, "r:UTF-8", &:read)
end
end
|
.require(*groups) ⇒ Object
113
114
115
|
# File 'lib/bundler.rb', line 113
def require(*groups)
setup(*groups).require(*groups)
end
|
.require_thor_actions ⇒ Object
4
5
6
|
# File 'lib/bundler/vendored_thor.rb', line 4
def self.require_thor_actions
Kernel.send(:require, "bundler/vendor/thor/lib/thor/actions")
end
|
.requires_sudo? ⇒ Boolean
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
|
# File 'lib/bundler.rb', line 354
def requires_sudo?
return @requires_sudo if defined?(@requires_sudo_ran)
sudo_present = which "sudo" if settings.allow_sudo?
if sudo_present
path = bundle_path
path = path.parent until path.exist?
bin_dir = Pathname.new(Bundler.system_bindir)
bin_dir = bin_dir.parent until bin_dir.exist?
files = [path, bin_dir] | Dir[bundle_path.join("build_info/*").to_s] | Dir[bundle_path.join("*").to_s]
unwritable_files = files.reject {|f| File.writable?(f) }
sudo_needed = !unwritable_files.empty?
if sudo_needed
Bundler.ui.warn "Following files may not be writable, so sudo is needed:\n #{unwritable_files.map(&:to_s).sort.join("\n ")}"
end
end
@requires_sudo_ran = true
@requires_sudo = settings.allow_sudo? && sudo_present && sudo_needed
end
|
.reset! ⇒ Object
481
482
483
484
485
|
# File 'lib/bundler.rb', line 481
def reset!
reset_paths!
Plugin.reset!
reset_rubygems!
end
|
.reset_paths! ⇒ Object
487
488
489
490
491
492
493
494
495
496
497
498
499
500
|
# File 'lib/bundler.rb', line 487
def reset_paths!
@bin_path = nil
@bundler_major_version = nil
@bundle_path = nil
@configured = nil
@configured_bundle_path = nil
@definition = nil
@load = nil
@locked_gems = nil
@root = nil
@settings = nil
@setup = nil
@user_home = nil
end
|
.reset_rubygems! ⇒ Object
502
503
504
505
506
507
|
# File 'lib/bundler.rb', line 502
def reset_rubygems!
return unless defined?(@rubygems) && @rubygems
rubygems.undo_replacements
rubygems.reset
@rubygems = nil
end
|
.rm_rf(path) ⇒ Object
260
261
262
263
264
265
266
267
268
269
270
|
# File 'lib/bundler.rb', line 260
def rm_rf(path)
FileUtils.remove_entry_secure(path) if path && File.exist?(path)
rescue ArgumentError
message = <<EOF
It is a security vulnerability to allow your home directory to be world-writable, and bundler can not continue.
You should probably consider fixing this issue by running `chmod o-w ~` on *nix.
Please refer to http://ruby-doc.org/stdlib-2.1.2/libdoc/fileutils/rdoc/FileUtils.html#method-c-remove_entry_secure for details.
EOF
File.world_writable?(path) ? Bundler.ui.warn(message) : raise
raise PathError, "Please fix the world-writable issue with your #{path} directory"
end
|
.root ⇒ Object
232
233
234
235
236
237
238
239
240
|
# File 'lib/bundler.rb', line 232
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
|
.settings ⇒ Object
272
273
274
275
276
|
# File 'lib/bundler.rb', line 272
def settings
@settings ||= Settings.new(app_config_path)
rescue GemfileNotFound
@settings = Settings.new(Pathname.new(".bundle").expand_path)
end
|
.setup(*groups) ⇒ Object
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
# File 'lib/bundler.rb', line 97
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
|
.specs_path ⇒ Object
228
229
230
|
# File 'lib/bundler.rb', line 228
def specs_path
bundle_path.join("specifications")
end
|
.sudo(str) ⇒ Object
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
|
# File 'lib/bundler.rb', line 405
def sudo(str)
SUDO_MUTEX.synchronize do
prompt = "\n\n" + <<-PROMPT.gsub(/^ {6}/, "").strip + " "
Your user account isn't allowed to install to the system RubyGems.
You can cancel this installation and run:
bundle install --path vendor/bundle
to install the gems into ./vendor/bundle/, or you can enter your password
and install the bundled gems to RubyGems using sudo.
Password:
PROMPT
unless @prompted_for_sudo ||= system(%(sudo -k -p "#{prompt}" true))
raise SudoNotPermittedError,
"Bundler requires sudo access to install at the moment. " \
"Try installing again, granting Bundler sudo access when prompted, or installing into a different path."
end
`sudo -p "#{prompt}" #{str}`
end
end
|
.system_bindir ⇒ Object
341
342
343
344
345
346
347
348
|
# File 'lib/bundler.rb', line 341
def system_bindir
Bundler.settings[:system_bindir] || Bundler.rubygems.gem_bindir
end
|
.tmp(name = Process.pid.to_s) ⇒ Object
255
256
257
258
|
# File 'lib/bundler.rb', line 255
def tmp(name = Process.pid.to_s)
Kernel.send(:require, "tmpdir")
Pathname.new(Dir.mktmpdir(["bundler", name]))
end
|
.tmp_home_path(login, warning) ⇒ Object
183
184
185
186
187
188
189
190
191
192
193
194
195
196
|
# File 'lib/bundler.rb', line 183
def tmp_home_path(login, warning)
login ||= "unknown"
Kernel.send(:require, "tmpdir")
path = Pathname.new(Dir.tmpdir).join("bundler", "home")
SharedHelpers.filesystem_access(path) do |tmp_home_path|
unless tmp_home_path.exist?
tmp_home_path.mkpath
tmp_home_path.chmod(0o777)
end
tmp_home_path.join(login).tap(&:mkpath)
end
rescue RuntimeError => e
raise e.exception("#{warning}\nBundler also failed to create a temporary home directory at `#{path}':\n#{e}")
end
|
.ui ⇒ Object
69
70
71
|
# File 'lib/bundler.rb', line 69
def ui
(defined?(@ui) && @ui) || (self.ui = UI::Silent.new)
end
|
.use_system_gems? ⇒ Boolean
350
351
352
|
# File 'lib/bundler.rb', line 350
def use_system_gems?
configured_bundle_path.use_system_gems?
end
|
.user_bundle_path(dir = "home") ⇒ Object
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
|
# File 'lib/bundler.rb', line 198
def user_bundle_path(dir = "home")
env_var, fallback = case dir
when "home"
["BUNDLE_USER_HOME", Pathname.new(user_home).join(".bundle")]
when "cache"
["BUNDLE_USER_CACHE", user_bundle_path.join("cache")]
when "config"
["BUNDLE_USER_CONFIG", user_bundle_path.join("config")]
when "plugin"
["BUNDLE_USER_PLUGIN", user_bundle_path.join("plugin")]
else
raise BundlerError, "Unknown user path requested: #{dir}"
end
Pathname.new(ENV.fetch(env_var, fallback))
end
|
.user_cache ⇒ Object
216
217
218
|
# File 'lib/bundler.rb', line 216
def user_cache
user_bundle_path("cache")
end
|
.user_home ⇒ Object
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
|
# File 'lib/bundler.rb', line 159
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
Kernel.send(:require, "etc")
user_home = tmp_home_path(Etc.getlogin, warning)
Bundler.ui.warn "#{warning}\nBundler will use `#{user_home}' as your home directory temporarily.\n"
user_home
else
Pathname.new(home)
end
end
end
|
.which(executable) ⇒ Object
392
393
394
395
396
397
398
399
400
401
402
403
|
# File 'lib/bundler.rb', line 392
def which(executable)
if File.file?(executable) && File.executable?(executable)
executable
elsif paths = ENV["PATH"]
quote = '"'.freeze
paths.split(File::PATH_SEPARATOR).find do |path|
path = path[1..-2] if path.start_with?(quote) && path.end_with?(quote)
executable_path = File.expand_path(executable, path)
return executable_path if File.file?(executable_path) && File.executable?(executable_path)
end
end
end
|
.with_clean_env ⇒ Object
312
313
314
|
# File 'lib/bundler.rb', line 312
def with_clean_env
with_env(clean_env) { yield }
end
|
.with_friendly_errors ⇒ Object
.with_original_env ⇒ Object
308
309
310
|
# File 'lib/bundler.rb', line 308
def with_original_env
with_env(original_env) { yield }
end
|