Module: Bundler
- Defined in:
- lib/bundler/lockfile_parser.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/source.rb,
lib/bundler/worker.rb,
lib/bundler/cli/gem.rb,
lib/bundler/cli/viz.rb,
lib/bundler/fetcher.rb,
lib/bundler/runtime.rb,
lib/bundler/version.rb,
lib/bundler/cli/exec.rb,
lib/bundler/cli/init.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/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/inject.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/source/git.rb,
lib/bundler/cli/console.rb,
lib/bundler/cli/install.rb,
lib/bundler/cli/package.rb,
lib/bundler/environment.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/current_ruby.rb,
lib/bundler/psyched_yaml.rb,
lib/bundler/ruby_version.rb,
lib/bundler/gem_installer.rb,
lib/bundler/match_platform.rb,
lib/bundler/shared_helpers.rb,
lib/bundler/friendly_errors.rb,
lib/bundler/source/rubygems.rb,
lib/bundler/anonymizable_uri.rb,
lib/bundler/lazy_specification.rb,
lib/bundler/similarity_detector.rb,
lib/bundler/remote_specification.rb,
lib/bundler/rubygems_integration.rb,
lib/bundler/source/git/git_proxy.rb,
lib/bundler/gem_path_manipulation.rb,
lib/bundler/source/local_rubygems.rb,
lib/bundler/source/path/installer.rb,
lib/bundler/endpoint_specification.rb,
lib/bundler/ssl_certs/certificate_manager.rb
Overview
Some versions of the Bundler 1.1 RC series introduced corrupted lockfiles. There were two major problems:
-
multiple copies of the same GIT section appeared in the lockfile
-
when this happened, those sections got multiple copies of gems in those sections.
As a result, Bundler 1.1 contains code that fixes the earlier corruption. We will remove this fix-up code in Bundler 1.2.
Defined Under Namespace
Modules: GemHelpers, MatchPlatform, RubyDsl, SSLCerts, SharedHelpers, UI
Classes: AnonymizableURI, BundlerError, CLI, CurrentRuby, CyclicDependencyError, Definition, DepProxy, Dependency, Deployment, Deprecate, DeprecatedError, Dsl, EndpointSpecification, Env, Environment, Fetcher, GemHelper, GemInstaller, GemNotFound, GemfileError, GemfileLockNotFound, GemfileNotFound, GemspecError, GitError, Graph, HTTPError, Index, Injector, InstallError, InstallHookError, Installer, InvalidOption, LazySpecification, LockfileError, LockfileParser, MarshalError, PathError, ProductionError, RemoteSpecification, Resolver, Retry, RubyVersion, RubyVersionMismatch, RubygemsIntegration, Runtime, SecurityError, Settings, SimilarityDetector, Source, SourceList, SpecSet, SystemRubyVersion, VersionConflict, Worker
Constant Summary
collapse
- ORIGINAL_ENV =
ENV.to_hash
- 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.8.3"
- WINDOWS =
RbConfig::CONFIG["host_os"] =~ %r!(msdos|mswin|djgpp|mingw)!
- FREEBSD =
RbConfig::CONFIG["host_os"] =~ /bsd/
- NULL =
WINDOWS ? "NUL" : "/dev/null"
- YamlSyntaxError =
Syck raises ArgumentError
::ArgumentError
Class Attribute Summary collapse
Class Method Summary
collapse
Class Attribute Details
.bundle_path ⇒ Object
Returns absolute path of where gems are installed on the filesystem.
100
101
102
|
# File 'lib/bundler.rb', line 100
def bundle_path
@bundle_path ||= Pathname.new(settings.path).expand_path(root)
end
|
.rubygems ⇒ Object
Returns the value of attribute rubygems.
609
610
611
|
# File 'lib/bundler/rubygems_integration.rb', line 609
def rubygems
@rubygems
end
|
.ui ⇒ Object
95
96
97
|
# File 'lib/bundler.rb', line 95
def ui
@ui ||= UI::Silent.new
end
|
Class Method Details
.app_cache(custom_path = nil) ⇒ Object
209
210
211
212
|
# File 'lib/bundler.rb', line 209
def app_cache(custom_path = nil)
path = custom_path || root
path.join(self.settings.app_cache_path)
end
|
.app_config_path ⇒ Object
203
204
205
206
207
|
# File 'lib/bundler.rb', line 203
def app_config_path
ENV['BUNDLE_APP_CONFIG'] ?
Pathname.new(ENV['BUNDLE_APP_CONFIG']).expand_path(root) :
root.join('.bundle')
end
|
.bin_path ⇒ Object
Returns absolute location of where binstubs are installed to.
105
106
107
108
109
110
111
112
|
# File 'lib/bundler.rb', line 105
def bin_path
@bin_path ||= begin
path = settings[:bin] || "bin"
path = Pathname.new(path).expand_path(root).expand_path
FileUtils.mkdir_p(path)
path
end
end
|
.cache ⇒ Object
189
190
191
|
# File 'lib/bundler.rb', line 189
def cache
bundle_path.join("cache/bundler")
end
|
.clean_exec(*args) ⇒ Object
255
256
257
|
# File 'lib/bundler.rb', line 255
def clean_exec(*args)
with_clean_env { Kernel.exec(*args) }
end
|
.clean_system(*args) ⇒ Object
251
252
253
|
# File 'lib/bundler.rb', line 251
def clean_system(*args)
with_clean_env { Kernel.system(*args) }
end
|
.cleanup ⇒ Object
219
220
221
222
|
# File 'lib/bundler.rb', line 219
def cleanup
FileUtils.remove_entry_secure(@tmp) if @tmp
rescue
end
|
.clear_gemspec_cache ⇒ Object
374
375
376
|
# File 'lib/bundler.rb', line 374
def clear_gemspec_cache
@gemspec_cache = {}
end
|
91
92
93
|
# File 'lib/bundler.rb', line 91
def configure
@configured ||= configure_gem_home_and_path
end
|
Returns current version of Ruby
5
6
7
|
# File 'lib/bundler/current_ruby.rb', line 5
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
150
151
152
153
154
155
156
157
|
# File 'lib/bundler.rb', line 150
def definition(unlock = nil)
@definition = nil if unlock
@definition ||= begin
configure
upgrade_lockfile
Definition.build(default_gemfile, default_lockfile, unlock)
end
end
|
.git_present? ⇒ Boolean
378
379
380
381
|
# File 'lib/bundler.rb', line 378
def git_present?
return @git_present if defined?(@git_present)
@git_present = Bundler.which("git") || Bundler.which("git.exe")
end
|
.home ⇒ Object
177
178
179
|
# File 'lib/bundler.rb', line 177
def home
bundle_path.join("bundler")
end
|
.install_path ⇒ Object
181
182
183
|
# File 'lib/bundler.rb', line 181
def install_path
home.join("gems")
end
|
.issues_url(exception) ⇒ Object
70
71
72
73
|
# File 'lib/bundler/friendly_errors.rb', line 70
def self.issues_url(exception)
'https://github.com/bundler/bundler/search?q=' \
"#{CGI.escape(exception.message)}&type=Issues"
end
|
.load ⇒ Object
137
138
139
|
# File 'lib/bundler.rb', line 137
def load
@load ||= Runtime.new(root, definition)
end
|
.load_gemspec(file) ⇒ Object
351
352
353
354
355
356
357
358
|
# File 'lib/bundler.rb', line 351
def load_gemspec(file)
@gemspec_cache ||= {}
key = File.expand_path(file)
spec = ( @gemspec_cache[key] ||= load_gemspec_uncached(file) )
spec.dup if spec
end
|
.load_gemspec_uncached(file) ⇒ Object
360
361
362
363
364
365
366
367
368
369
370
371
372
|
# File 'lib/bundler.rb', line 360
def load_gemspec_uncached(file)
path = Pathname.new(file)
SharedHelpers.chdir(path.dirname.to_s) do
contents = path.read
if contents[0..2] == "---" eval_yaml_gemspec(path, contents)
else
eval_gemspec(path, contents)
end
end
end
|
.load_marshal(data) ⇒ Object
345
346
347
348
349
|
# File 'lib/bundler.rb', line 345
def load_marshal(data)
Marshal.load(data)
rescue => e
raise MarshalError, "#{e.class}: #{e.message}"
end
|
.mkdir_p(path) ⇒ Object
306
307
308
309
310
311
312
|
# File 'lib/bundler.rb', line 306
def mkdir_p(path)
if requires_sudo?
sudo "mkdir -p '#{path}'" unless File.exist?(path)
else
FileUtils.mkdir_p(path)
end
end
|
.preserve_gem_path ⇒ Object
2
3
4
5
6
7
|
# File 'lib/bundler/gem_path_manipulation.rb', line 2
def self.preserve_gem_path
original_gem_path = ENV["_ORIGINAL_GEM_PATH"]
gem_path = ENV["GEM_PATH"]
ENV["_ORIGINAL_GEM_PATH"] = gem_path if original_gem_path.nil? || original_gem_path == ""
ENV["GEM_PATH"] = original_gem_path if gem_path.nil? || gem_path == ""
end
|
.read_file(file) ⇒ Object
341
342
343
|
# File 'lib/bundler.rb', line 341
def read_file(file)
File.open(file, "rb") { |f| f.read }
end
|
.request_issue_report_for(e) ⇒ Object
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
# File 'lib/bundler/friendly_errors.rb', line 41
def self.request_issue_report_for(e)
Bundler.ui.info <<-EOS.gsub(/^ {6}/, '')
#{'――― ERROR REPORT TEMPLATE ―――――――――――――――――――――――――――――――――――――――――――――――――――――――'}
- What did you do?
- What did you expect to happen?
- What happened instead?
Error details
#{e.class}: #{e.message}
#{e.backtrace.join("\n ")}
#{Bundler::Env.new.report(:print_gemfile => false).gsub(/\n/, "\n ").strip}
#{'――― TEMPLATE END ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――'}
EOS
Bundler.ui.error "Unfortunately, an unexpected error occurred, and Bundler cannot continue."
Bundler.ui.warn <<-EOS.gsub(/^ {6}/, '')
First, try this link to see if there are any existing issue reports for this error:
#{issues_url(e)}
If there aren't any reports for this error yet, please create copy and paste the report template above into a new issue. Don't forget to anonymize any private data! The new issue form is located at:
https://github.com/bundler/bundler/issues/new
EOS
end
|
.require(*groups) ⇒ Object
133
134
135
|
# File 'lib/bundler.rb', line 133
def require(*groups)
setup(*groups).require(*groups)
end
|
.requires_sudo? ⇒ Boolean
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
|
# File 'lib/bundler.rb', line 280
def requires_sudo?
return @requires_sudo if defined?(@requires_sudo_ran)
if settings.allow_sudo?
sudo_present = which "sudo"
end
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[path.join('build_info/*').to_s] | Dir[path.join('*').to_s]
sudo_needed = files.any?{|f| !File.writable?(f) }
end
@requires_sudo_ran = true
@requires_sudo = settings.allow_sudo? && sudo_present && sudo_needed
end
|
.reset! ⇒ Object
387
388
389
|
# File 'lib/bundler.rb', line 387
def reset!
@definition = nil
end
|
.root ⇒ Object
193
194
195
196
197
198
199
200
201
|
# File 'lib/bundler.rb', line 193
def root
@root ||= begin
default_gemfile.dirname.expand_path
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
|
.ruby_version ⇒ Object
383
384
385
|
# File 'lib/bundler.rb', line 383
def ruby_version
@ruby_version ||= SystemRubyVersion.new
end
|
.settings ⇒ Object
224
225
226
227
228
229
|
# File 'lib/bundler.rb', line 224
def settings
return @settings if defined?(@settings)
@settings = Settings.new(app_config_path)
rescue GemfileNotFound
@settings = Settings.new(Pathname.new(".bundle").expand_path)
end
|
.setup(*groups) ⇒ Object
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
# File 'lib/bundler.rb', line 114
def setup(*groups)
return @setup if defined?(@setup)
definition.validate_ruby!
if groups.empty?
@setup = load.setup
else
@completed_groups ||= []
unloaded = groups - @completed_groups
@completed_groups = groups
unloaded.any? ? load.setup(*groups) : load
end
end
|
.specs_path ⇒ Object
185
186
187
|
# File 'lib/bundler.rb', line 185
def specs_path
bundle_path.join("specifications")
end
|
.sudo(str) ⇒ Object
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
|
# File 'lib/bundler.rb', line 325
def sudo(str)
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
`sudo -p "#{prompt}" #{str}`
end
|
.system_bindir ⇒ Object
271
272
273
274
275
276
277
278
|
# File 'lib/bundler.rb', line 271
def system_bindir
Bundler.settings[:system_bindir] || Bundler.rubygems.gem_bindir
end
|
.tmp(name = Process.pid.to_s) ⇒ Object
214
215
216
217
|
# File 'lib/bundler.rb', line 214
def tmp(name = Process.pid.to_s)
@tmp ||= Pathname.new Dir.mktmpdir("bundler")
@tmp.join(name)
end
|
.user_bundle_path ⇒ Object
173
174
175
|
# File 'lib/bundler.rb', line 173
def user_bundle_path
Pathname.new(Bundler.rubygems.user_home).join(".bundler")
end
|
.which(executable) ⇒ Object
314
315
316
317
318
319
320
321
322
323
|
# File 'lib/bundler.rb', line 314
def which(executable)
if File.file?(executable) && File.executable?(executable)
executable
elsif ENV['PATH']
path = ENV['PATH'].split(File::PATH_SEPARATOR).find do |p|
File.executable?(File.join(p, executable))
end
path && File.expand_path(executable, path)
end
end
|
.with_clean_env ⇒ Object
239
240
241
242
243
244
245
246
247
248
249
|
# File 'lib/bundler.rb', line 239
def with_clean_env
with_original_env do
ENV['MANPATH'] = ENV['BUNDLE_ORIG_MANPATH']
ENV.delete_if { |k,_| k[0,7] == 'BUNDLE_' }
if ENV.has_key? 'RUBYOPT'
ENV['RUBYOPT'] = ENV['RUBYOPT'].sub '-rbundler/setup', ''
ENV['RUBYOPT'] = ENV['RUBYOPT'].sub "-I#{File.expand_path('..', __FILE__)}", ''
end
yield
end
end
|
.with_friendly_errors ⇒ Object
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
# File 'lib/bundler/friendly_errors.rb', line 5
def self.with_friendly_errors
yield
rescue Bundler::BundlerError => e
Bundler.ui.error e.message, :wrap => true
Bundler.ui.trace e
exit e.status_code
rescue Thor::AmbiguousTaskError => e
Bundler.ui.error e.message
exit 15
rescue Thor::UndefinedTaskError => e
Bundler.ui.error e.message
exit 15
rescue Thor::Error => e
Bundler.ui.error e.message
exit 1
rescue LoadError => e
raise e unless e.message =~ /cannot load such file -- openssl|openssl.so|libcrypto.so/
Bundler.ui.error "\nCould not load OpenSSL."
Bundler.ui.warn <<-WARN, :wrap => true
You must recompile Ruby with OpenSSL support or change the sources in your \
Gemfile from 'https' to 'http'. Instructions for compiling with OpenSSL \
using RVM are available at http://rvm.io/packages/openssl.
WARN
Bundler.ui.trace e
exit 1
rescue Interrupt => e
Bundler.ui.error "\nQuitting..."
Bundler.ui.trace e
exit 1
rescue SystemExit => e
exit e.status
rescue Exception => e
request_issue_report_for(e)
exit 1
end
|
.with_original_env ⇒ Object
231
232
233
234
235
236
237
|
# File 'lib/bundler.rb', line 231
def with_original_env
bundled_env = ENV.to_hash
ENV.replace(ORIGINAL_ENV)
yield
ensure
ENV.replace(bundled_env.to_hash)
end
|