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/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/source/svn.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/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/parallel_workers.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/source/svn/svn_proxy.rb,
lib/bundler/gem_path_manipulation.rb,
lib/bundler/source/path/installer.rb,
lib/bundler/endpoint_specification.rb,
lib/bundler/parallel_workers/worker.rb,
lib/bundler/parallel_workers/unix_worker.rb,
lib/bundler/ssl_certs/certificate_manager.rb,
lib/bundler/parallel_workers/thread_worker.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, ParallelWorkers, RubyDsl, SSLCerts, SharedHelpers, UI
Classes: 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, SVNError, SecurityError, Settings, SimilarityDetector, Source, SpecSet, SystemRubyVersion, VersionConflict
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.6.2"
- 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.
104
105
106
|
# File 'lib/bundler.rb', line 104
def bundle_path
@bundle_path ||= Pathname.new(settings.path).expand_path(root)
end
|
.rubygems ⇒ Object
Returns the value of attribute rubygems.
576
577
578
|
# File 'lib/bundler/rubygems_integration.rb', line 576
def rubygems
@rubygems
end
|
.ui ⇒ Object
99
100
101
|
# File 'lib/bundler.rb', line 99
def ui
@ui ||= UI::Silent.new
end
|
Class Method Details
.app_cache(custom_path = nil) ⇒ Object
207
208
209
210
|
# File 'lib/bundler.rb', line 207
def app_cache(custom_path = nil)
path = custom_path || root
path.join("vendor/cache")
end
|
.app_config_path ⇒ Object
201
202
203
204
205
|
# File 'lib/bundler.rb', line 201
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.
109
110
111
112
113
114
115
116
|
# File 'lib/bundler.rb', line 109
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
193
194
195
|
# File 'lib/bundler.rb', line 193
def cache
bundle_path.join("cache/bundler")
end
|
.clean_exec(*args) ⇒ Object
249
250
251
|
# File 'lib/bundler.rb', line 249
def clean_exec(*args)
with_clean_env { Kernel.exec(*args) }
end
|
.clean_system(*args) ⇒ Object
245
246
247
|
# File 'lib/bundler.rb', line 245
def clean_system(*args)
with_clean_env { Kernel.system(*args) }
end
|
.clear_gemspec_cache ⇒ Object
364
365
366
|
# File 'lib/bundler.rb', line 364
def clear_gemspec_cache
@gemspec_cache = {}
end
|
95
96
97
|
# File 'lib/bundler.rb', line 95
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_gemfile ⇒ Object
253
254
255
|
# File 'lib/bundler.rb', line 253
def default_gemfile
SharedHelpers.default_gemfile
end
|
.default_lockfile ⇒ Object
257
258
259
|
# File 'lib/bundler.rb', line 257
def default_lockfile
SharedHelpers.default_lockfile
end
|
Returns an instance of Bundler::Definition for given Gemfile and lockfile
154
155
156
157
158
159
160
161
|
# File 'lib/bundler.rb', line 154
def definition(unlock = nil)
@definition = nil if unlock
@definition ||= begin
configure
upgrade_lockfile
Definition.build(default_gemfile, default_lockfile, unlock)
end
end
|
.environment ⇒ Object
145
146
147
|
# File 'lib/bundler.rb', line 145
def environment
Bundler::Environment.new(root, definition)
end
|
.git_present? ⇒ Boolean
368
369
370
371
|
# File 'lib/bundler.rb', line 368
def git_present?
return @git_present if defined?(@git_present)
@git_present = Bundler.which("git") || Bundler.which("git.exe")
end
|
.home ⇒ Object
181
182
183
|
# File 'lib/bundler.rb', line 181
def home
bundle_path.join("bundler")
end
|
.install_path ⇒ Object
185
186
187
|
# File 'lib/bundler.rb', line 185
def install_path
home.join("gems")
end
|
.load ⇒ Object
141
142
143
|
# File 'lib/bundler.rb', line 141
def load
@load ||= Runtime.new(root, definition)
end
|
.load_gemspec(file) ⇒ Object
341
342
343
344
345
346
347
348
|
# File 'lib/bundler.rb', line 341
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
350
351
352
353
354
355
356
357
358
359
360
361
362
|
# File 'lib/bundler.rb', line 350
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
335
336
337
338
339
|
# File 'lib/bundler.rb', line 335
def load_marshal(data)
Marshal.load(data)
rescue => e
raise MarshalError, "#{e.class}: #{e.message}"
end
|
.locked_gems ⇒ Object
163
164
165
166
167
168
169
170
171
|
# File 'lib/bundler.rb', line 163
def locked_gems
return @locked_gems if defined?(@locked_gems)
if Bundler.default_lockfile.exist?
lock = Bundler.read_file(Bundler.default_lockfile)
@locked_gems = LockfileParser.new(lock)
else
@locked_gems = nil
end
end
|
.mkdir_p(path) ⇒ Object
296
297
298
299
300
301
302
|
# File 'lib/bundler.rb', line 296
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
331
332
333
|
# File 'lib/bundler.rb', line 331
def read_file(file)
File.open(file, "rb") { |f| f.read }
end
|
.require(*groups) ⇒ Object
137
138
139
|
# File 'lib/bundler.rb', line 137
def require(*groups)
setup(*groups).require(*groups)
end
|
.requires_sudo? ⇒ Boolean
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
|
# File 'lib/bundler.rb', line 270
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
382
383
384
|
# File 'lib/bundler.rb', line 382
def reset!
@definition = nil
end
|
.root ⇒ Object
197
198
199
|
# File 'lib/bundler.rb', line 197
def root
default_gemfile.dirname.expand_path
end
|
.ruby_scope ⇒ Object
173
174
175
|
# File 'lib/bundler.rb', line 173
def ruby_scope
"#{Bundler.rubygems.ruby_engine}/#{Bundler.rubygems.config_map[:ruby_version]}"
end
|
.ruby_version ⇒ Object
378
379
380
|
# File 'lib/bundler.rb', line 378
def ruby_version
@ruby_version ||= SystemRubyVersion.new
end
|
.settings ⇒ Object
217
218
219
220
221
222
223
|
# File 'lib/bundler.rb', line 217
def settings
@settings ||= begin
Settings.new(app_config_path)
rescue GemfileNotFound
Settings.new
end
end
|
.setup(*groups) ⇒ Object
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
# File 'lib/bundler.rb', line 118
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
189
190
191
|
# File 'lib/bundler.rb', line 189
def specs_path
bundle_path.join("specifications")
end
|
.sudo(str) ⇒ Object
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
|
# File 'lib/bundler.rb', line 315
def sudo(str)
prompt = "\n\n" + " Your user account isn't allowed to install to the system Rubygems.\n You can cancel this installation and run:\n\n bundle install --path vendor/bundle\n\n to install the gems into ./vendor/bundle/, or you can enter your password\n and install the bundled gems to Rubygems using sudo.\n\n Password:\n PROMPT\n\n `sudo -p \"\#{prompt}\" \#{str}`\nend\n".gsub(/^ {6}/, '').strip + " "
|
.svn_present? ⇒ Boolean
373
374
375
376
|
# File 'lib/bundler.rb', line 373
def svn_present?
return @svn_present if defined?(@svn_present)
@svn_present = Bundler.which("svn") || Bundler.which("svn.exe")
end
|
.system_bindir ⇒ Object
261
262
263
264
265
266
267
268
|
# File 'lib/bundler.rb', line 261
def system_bindir
Bundler.settings[:system_bindir] || Bundler.rubygems.gem_bindir
end
|
.tmp(name = Process.pid.to_s) ⇒ Object
212
213
214
215
|
# File 'lib/bundler.rb', line 212
def tmp(name = Process.pid.to_s)
@tmp ||= Pathname.new Dir.mktmpdir("bundler")
@tmp.join(name)
end
|
.user_bundle_path ⇒ Object
177
178
179
|
# File 'lib/bundler.rb', line 177
def user_bundle_path
Pathname.new(Bundler.rubygems.user_home).join(".bundler")
end
|
.which(executable) ⇒ Object
304
305
306
307
308
309
310
311
312
313
|
# File 'lib/bundler.rb', line 304
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
233
234
235
236
237
238
239
240
241
242
243
|
# File 'lib/bundler.rb', line 233
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
4
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
40
41
|
# File 'lib/bundler/friendly_errors.rb', line 4
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 " You must recompile Ruby with OpenSSL support or change the sources in your \\\n Gemfile from 'https' to 'http'. Instructions for compiling with OpenSSL \\\n using RVM are available at http://rvm.io/packages/openssl.\n WARN\n Bundler.ui.trace e\n exit 1\nrescue Interrupt => e\n Bundler.ui.error \"\\nQuitting...\"\n Bundler.ui.trace e\n exit 1\nrescue SystemExit => e\n exit e.status\nrescue Exception => e\n Bundler.ui.error <<-ERR, :wrap => true\n Unfortunately, a fatal error has occurred. Please see the Bundler \\\n troubleshooting documentation at http://bit.ly/bundler-issues. Thanks!\n ERR\n raise e\nend\n", :wrap => true
|
.with_original_env ⇒ Object
225
226
227
228
229
230
231
|
# File 'lib/bundler.rb', line 225
def with_original_env
bundled_env = ENV.to_hash
ENV.replace(ORIGINAL_ENV)
yield
ensure
ENV.replace(bundled_env.to_hash)
end
|