Class: Bundler::Injector

Inherits:
Object
  • Object
show all
Defined in:
lib/bundler/injector.rb

Class Method Summary (collapse)

Instance Method Summary (collapse)

Constructor Details

- (Injector) initialize(new_deps)



8
9
10
# File 'lib/bundler/injector.rb', line 8

def initialize(new_deps)
  @new_deps = new_deps
end

Class Method Details

+ (Object) inject(new_deps)



3
4
5
6
# File 'lib/bundler/injector.rb', line 3

def self.inject(new_deps)
  injector = new(new_deps)
  injector.inject(Bundler.default_gemfile, Bundler.default_lockfile)
end

Instance Method Details

- (Object) inject(gemfile_path, lockfile_path)



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
42
43
44
# File 'lib/bundler/injector.rb', line 12

def inject(gemfile_path, lockfile_path)
  if Bundler.settings[:frozen]
    # ensure the lock and Gemfile are synced
    Bundler.definition.ensure_equivalent_gemfile_and_lockfile(true)
    # temporarily remove frozen while we inject
    frozen = Bundler.settings.delete(:frozen)
  end

  # evaluate the Gemfile we have now
  builder = Dsl.new
  builder.eval_gemfile(gemfile_path)

  # don't inject any gems that are already in the Gemfile
  @new_deps -= builder.dependencies

  # add new deps to the end of the in-memory Gemfile
  builder.eval_gemfile("injected gems", new_gem_lines) if @new_deps.any?

  # resolve to see if the new deps broke anything
  definition = builder.to_definition(lockfile_path, {})
  definition.resolve_remotely!

  # since nothing broke, we can add those gems to the gemfile
  append_to(gemfile_path) if @new_deps.any?

  # since we resolved successfully, write out the lockfile
  definition.lock(Bundler.default_lockfile)

  # return an array of the deps that we added
  return @new_deps
ensure
  Bundler.settings[:frozen] = '1' if frozen
end