bundler 2.5.18 → 2.5.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +28 -0
  3. data/lib/bundler/build_metadata.rb +2 -2
  4. data/lib/bundler/cli/add.rb +1 -1
  5. data/lib/bundler/cli/gem.rb +4 -1
  6. data/lib/bundler/cli/lock.rb +5 -5
  7. data/lib/bundler/cli/outdated.rb +1 -1
  8. data/lib/bundler/definition.rb +3 -7
  9. data/lib/bundler/dsl.rb +27 -17
  10. data/lib/bundler/errors.rb +7 -5
  11. data/lib/bundler/fetcher.rb +2 -2
  12. data/lib/bundler/inline.rb +19 -4
  13. data/lib/bundler/installer/gem_installer.rb +4 -2
  14. data/lib/bundler/installer/parallel_installer.rb +3 -2
  15. data/lib/bundler/installer.rb +9 -11
  16. data/lib/bundler/man/bundle-add.1 +27 -16
  17. data/lib/bundler/man/bundle-add.1.ronn +37 -14
  18. data/lib/bundler/man/bundle-binstubs.1 +1 -1
  19. data/lib/bundler/man/bundle-cache.1 +1 -1
  20. data/lib/bundler/man/bundle-check.1 +1 -1
  21. data/lib/bundler/man/bundle-clean.1 +1 -1
  22. data/lib/bundler/man/bundle-config.1 +1 -1
  23. data/lib/bundler/man/bundle-console.1 +1 -1
  24. data/lib/bundler/man/bundle-doctor.1 +1 -1
  25. data/lib/bundler/man/bundle-exec.1 +1 -1
  26. data/lib/bundler/man/bundle-gem.1 +1 -1
  27. data/lib/bundler/man/bundle-help.1 +1 -1
  28. data/lib/bundler/man/bundle-info.1 +1 -1
  29. data/lib/bundler/man/bundle-init.1 +1 -1
  30. data/lib/bundler/man/bundle-inject.1 +1 -1
  31. data/lib/bundler/man/bundle-install.1 +1 -1
  32. data/lib/bundler/man/bundle-list.1 +1 -1
  33. data/lib/bundler/man/bundle-lock.1 +1 -1
  34. data/lib/bundler/man/bundle-open.1 +1 -1
  35. data/lib/bundler/man/bundle-outdated.1 +1 -1
  36. data/lib/bundler/man/bundle-platform.1 +1 -1
  37. data/lib/bundler/man/bundle-plugin.1 +1 -1
  38. data/lib/bundler/man/bundle-pristine.1 +1 -1
  39. data/lib/bundler/man/bundle-remove.1 +1 -1
  40. data/lib/bundler/man/bundle-show.1 +1 -1
  41. data/lib/bundler/man/bundle-update.1 +1 -1
  42. data/lib/bundler/man/bundle-version.1 +1 -1
  43. data/lib/bundler/man/bundle-viz.1 +1 -1
  44. data/lib/bundler/man/bundle.1 +1 -1
  45. data/lib/bundler/man/gemfile.5 +3 -1
  46. data/lib/bundler/man/gemfile.5.ronn +6 -0
  47. data/lib/bundler/retry.rb +1 -1
  48. data/lib/bundler/ruby_version.rb +7 -1
  49. data/lib/bundler/rubygems_ext.rb +43 -16
  50. data/lib/bundler/rubygems_gem_installer.rb +4 -3
  51. data/lib/bundler/source/git.rb +9 -5
  52. data/lib/bundler/source/rubygems.rb +5 -12
  53. data/lib/bundler/ui/shell.rb +24 -2
  54. data/lib/bundler/ui/silent.rb +12 -1
  55. data/lib/bundler/vendor/securerandom/.document +1 -0
  56. data/lib/bundler/vendor/securerandom/LICENSE.txt +22 -0
  57. data/lib/bundler/vendor/securerandom/lib/random/formatter.rb +373 -0
  58. data/lib/bundler/vendor/securerandom/lib/securerandom.rb +96 -0
  59. data/lib/bundler/vendored_securerandom.rb +14 -0
  60. data/lib/bundler/version.rb +1 -1
  61. data/lib/bundler.rb +1 -1
  62. metadata +8 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5385db419c628f24a112828aaa2154b615e4654418efcd0ca7429b15bf3849e5
4
- data.tar.gz: f8854df0d8ba8b5b93b0f2984d0f640a8582cae6aca768fbd1a71d9652ac4b78
3
+ metadata.gz: cf59bff2285c5f99b1db1fbb57d3c372624ccc17fd68d8267d00d95739edbfda
4
+ data.tar.gz: 5bd1a4207b31f2437da59356cdae6f2c2999842af730d866ec8799f6b6c8f589
5
5
  SHA512:
6
- metadata.gz: 0aea6d055bd4fab23aa27f322af55f1b021155d80a0352e40d7025e99006ee88843db327ed7bab1e2210d3c065bf201e11cc31a9fa46075e6abf2b67f85b6821
7
- data.tar.gz: 041fcf5abd1f69f26fdf3f11eb4fced176c30ac3f0dbfb47df1c40d5308dacc9179ae32438737db6a5d9300a20b0f6bc4122c0fb762ee83b442144f969c328e4
6
+ metadata.gz: e6d98b6893658ee4fca7b7bc633d73e48d88c736c55eb6bf807f9d37c1fce3975d965aa08d5b9b03f5b1b8ce1a84028b78a6510620c8936e7bcd86655ed983da
7
+ data.tar.gz: f1edc568d88a5f2dcc82f5c6d74fe418e3ee186ef592b56df315b1678a0f60788bebd1c10f2bc2c463d85c5a050d0a959c956bacf8fffa62c55e73f9b8ee789c
data/CHANGELOG.md CHANGED
@@ -1,3 +1,31 @@
1
+ # 2.5.19 (September 18, 2024)
2
+
3
+ ## Enhancements:
4
+
5
+ - Raise original errors when unexpected errors happen during Gemfile evaluation [#8003](https://github.com/rubygems/rubygems/pull/8003)
6
+ - Make an exe file executable when generating new gems [#8020](https://github.com/rubygems/rubygems/pull/8020)
7
+ - Gracefully handle gem activation conflicts in inline mode [#5535](https://github.com/rubygems/rubygems/pull/5535)
8
+ - Don't include hook templates in cached git source [#8013](https://github.com/rubygems/rubygems/pull/8013)
9
+ - Fix some errors about a previous installation folder that's unsafe to remove, when there's no need to remove it [#7985](https://github.com/rubygems/rubygems/pull/7985)
10
+ - Emit progress to stderr during `bundle outdated --parseable` [#7966](https://github.com/rubygems/rubygems/pull/7966)
11
+ - Reject unknown platforms when running `bundle lock --add-platform` [#7967](https://github.com/rubygems/rubygems/pull/7967)
12
+ - Emit progress to stderr when `--print` is passed to `bundle lock` [#7957](https://github.com/rubygems/rubygems/pull/7957)
13
+
14
+ ## Bug fixes:
15
+
16
+ - Fix `bundle install --local` hitting the network when default gems are included [#8027](https://github.com/rubygems/rubygems/pull/8027)
17
+ - Remove temporary `.lock` files unintentionally left around by gem installer [#8022](https://github.com/rubygems/rubygems/pull/8022)
18
+ - Fix `bundle exec rake install` failing when local gem has extensions [#7977](https://github.com/rubygems/rubygems/pull/7977)
19
+ - Load gemspecs in the context of its parent also when using local overrides [#7993](https://github.com/rubygems/rubygems/pull/7993)
20
+ - Fix `bundler/inline` failing in Ruby 3.2 due to conflicting `securerandom` versions [#7984](https://github.com/rubygems/rubygems/pull/7984)
21
+ - Don't blow up when explicit version is removed from some git sources [#7973](https://github.com/rubygems/rubygems/pull/7973)
22
+ - Fix `gem exec rails new project` failing on Ruby 3.2 [#7960](https://github.com/rubygems/rubygems/pull/7960)
23
+
24
+ ## Documentation:
25
+
26
+ - Improve `bundle add` man page [#5903](https://github.com/rubygems/rubygems/pull/5903)
27
+ - Add some documentation about backwards compatibility [#7964](https://github.com/rubygems/rubygems/pull/7964)
28
+
1
29
  # 2.5.18 (August 26, 2024)
2
30
 
3
31
  ## Enhancements:
@@ -4,8 +4,8 @@ module Bundler
4
4
  # Represents metadata from when the Bundler gem was built.
5
5
  module BuildMetadata
6
6
  # begin ivars
7
- @built_at = "2024-08-26".freeze
8
- @git_commit_sha = "c218aab519".freeze
7
+ @built_at = "2024-09-18".freeze
8
+ @git_commit_sha = "d569990361".freeze
9
9
  @release = true
10
10
  # end ivars
11
11
 
@@ -34,7 +34,7 @@ module Bundler
34
34
  end
35
35
 
36
36
  def validate_options!
37
- raise InvalidOption, "You can not specify `--strict` and `--optimistic` at the same time." if options[:strict] && options[:optimistic]
37
+ raise InvalidOption, "You cannot specify `--strict` and `--optimistic` at the same time." if options[:strict] && options[:optimistic]
38
38
 
39
39
  # raise error when no gems are specified
40
40
  raise InvalidOption, "Please specify gems to add." if gems.empty?
@@ -191,7 +191,10 @@ module Bundler
191
191
  templates.merge!("standard.yml.tt" => ".standard.yml")
192
192
  end
193
193
 
194
- templates.merge!("exe/newgem.tt" => "exe/#{name}") if config[:exe]
194
+ if config[:exe]
195
+ templates.merge!("exe/newgem.tt" => "exe/#{name}")
196
+ executables.push("exe/#{name}")
197
+ end
195
198
 
196
199
  if extension == "c"
197
200
  templates.merge!(
@@ -15,8 +15,8 @@ module Bundler
15
15
  end
16
16
 
17
17
  print = options[:print]
18
- previous_ui_level = Bundler.ui.level
19
- Bundler.ui.level = "silent" if print
18
+ previous_output_stream = Bundler.ui.output_stream
19
+ Bundler.ui.output_stream = :stderr if print
20
20
 
21
21
  Bundler::Fetcher.disable_endpoint = options["full-index"]
22
22
 
@@ -48,8 +48,8 @@ module Bundler
48
48
  options["add-platform"].each do |platform_string|
49
49
  platform = Gem::Platform.new(platform_string)
50
50
  if platform.to_s == "unknown"
51
- Bundler.ui.warn "The platform `#{platform_string}` is unknown to RubyGems " \
52
- "and adding it will likely lead to resolution errors"
51
+ Bundler.ui.error "The platform `#{platform_string}` is unknown to RubyGems and can't be added to the lockfile."
52
+ exit 1
53
53
  end
54
54
  definition.add_platform(platform)
55
55
  end
@@ -68,7 +68,7 @@ module Bundler
68
68
  end
69
69
  end
70
70
 
71
- Bundler.ui.level = previous_ui_level
71
+ Bundler.ui.output_stream = previous_output_stream
72
72
  end
73
73
  end
74
74
  end
@@ -54,7 +54,7 @@ module Bundler
54
54
  end
55
55
 
56
56
  if options[:parseable]
57
- Bundler.ui.silence(&definition_resolution)
57
+ Bundler.ui.progress(&definition_resolution)
58
58
  else
59
59
  definition_resolution.call
60
60
  end
@@ -511,15 +511,11 @@ module Bundler
511
511
  end
512
512
 
513
513
  def lockfile_exists?
514
- file_exists?(lockfile)
515
- end
516
-
517
- def file_exists?(file)
518
- file && File.exist?(file)
514
+ lockfile && File.exist?(lockfile)
519
515
  end
520
516
 
521
517
  def write_lock(file, preserve_unknown_sections)
522
- return if Definition.no_lock
518
+ return if Definition.no_lock || file.nil?
523
519
 
524
520
  contents = to_lock
525
521
 
@@ -536,7 +532,7 @@ module Bundler
536
532
 
537
533
  preserve_unknown_sections ||= !updating_major && (Bundler.frozen_bundle? || !(unlocking? || @unlocking_bundler))
538
534
 
539
- if file_exists?(file) && lockfiles_equal?(@lockfile_contents, contents, preserve_unknown_sections)
535
+ if File.exist?(file) && lockfiles_equal?(@lockfile_contents, contents, preserve_unknown_sections)
540
536
  return if Bundler.frozen_bundle?
541
537
  SharedHelpers.filesystem_access(file) { FileUtils.touch(file) }
542
538
  return
data/lib/bundler/dsl.rb CHANGED
@@ -42,20 +42,20 @@ module Bundler
42
42
  end
43
43
 
44
44
  def eval_gemfile(gemfile, contents = nil)
45
- expanded_gemfile_path = Pathname.new(gemfile).expand_path(@gemfile&.parent)
46
- original_gemfile = @gemfile
47
- @gemfile = expanded_gemfile_path
48
- @gemfiles << expanded_gemfile_path
49
- contents ||= Bundler.read_file(@gemfile.to_s)
50
- instance_eval(contents, @gemfile.to_s, 1)
51
- rescue Exception => e # rubocop:disable Lint/RescueException
52
- message = "There was an error " \
53
- "#{e.is_a?(GemfileEvalError) ? "evaluating" : "parsing"} " \
54
- "`#{File.basename gemfile.to_s}`: #{e.message}"
55
-
56
- raise DSLError.new(message, gemfile, e.backtrace, contents)
57
- ensure
58
- @gemfile = original_gemfile
45
+ with_gemfile(gemfile) do |current_gemfile|
46
+ contents ||= Bundler.read_file(current_gemfile)
47
+ instance_eval(contents, current_gemfile, 1)
48
+ rescue GemfileEvalError => e
49
+ message = "There was an error evaluating `#{File.basename current_gemfile}`: #{e.message}"
50
+ raise DSLError.new(message, current_gemfile, e.backtrace, contents)
51
+ rescue GemfileError, InvalidArgumentError, InvalidOption, DeprecatedError, ScriptError => e
52
+ message = "There was an error parsing `#{File.basename current_gemfile}`: #{e.message}"
53
+ raise DSLError.new(message, current_gemfile, e.backtrace, contents)
54
+ rescue StandardError => e
55
+ raise unless e.backtrace_locations.first.path == current_gemfile
56
+ message = "There was an error parsing `#{File.basename current_gemfile}`: #{e.message}"
57
+ raise DSLError.new(message, current_gemfile, e.backtrace, contents)
58
+ end
59
59
  end
60
60
 
61
61
  def gemspec(opts = nil)
@@ -219,7 +219,7 @@ module Bundler
219
219
  end
220
220
 
221
221
  def github(repo, options = {})
222
- raise ArgumentError, "GitHub sources require a block" unless block_given?
222
+ raise InvalidArgumentError, "GitHub sources require a block" unless block_given?
223
223
  github_uri = @git_sources["github"].call(repo)
224
224
  git_options = normalize_hash(options).merge("uri" => github_uri)
225
225
  git_source = @sources.add_git_source(git_options)
@@ -285,6 +285,16 @@ module Bundler
285
285
 
286
286
  private
287
287
 
288
+ def with_gemfile(gemfile)
289
+ expanded_gemfile_path = Pathname.new(gemfile).expand_path(@gemfile&.parent)
290
+ original_gemfile = @gemfile
291
+ @gemfile = expanded_gemfile_path
292
+ @gemfiles << expanded_gemfile_path
293
+ yield @gemfile.to_s
294
+ ensure
295
+ @gemfile = original_gemfile
296
+ end
297
+
288
298
  def add_git_sources
289
299
  git_source(:github) do |repo_name|
290
300
  if repo_name =~ GITHUB_PULL_REQUEST_URL
@@ -577,7 +587,7 @@ module Bundler
577
587
 
578
588
  return m unless backtrace && dsl_path && contents
579
589
 
580
- trace_line = backtrace.find {|l| l.include?(dsl_path.to_s) } || trace_line
590
+ trace_line = backtrace.find {|l| l.include?(dsl_path) } || trace_line
581
591
  return m unless trace_line
582
592
  line_numer = trace_line.split(":")[1].to_i - 1
583
593
  return m unless line_numer
@@ -603,7 +613,7 @@ module Bundler
603
613
 
604
614
  def parse_line_number_from_description
605
615
  description = self.description
606
- if dsl_path && description =~ /((#{Regexp.quote File.expand_path(dsl_path)}|#{Regexp.quote dsl_path.to_s}):\d+)/
616
+ if dsl_path && description =~ /((#{Regexp.quote File.expand_path(dsl_path)}|#{Regexp.quote dsl_path}):\d+)/
607
617
  trace_line = Regexp.last_match[1]
608
618
  description = description.sub(/\n.*\n(\.\.\.)? *\^~+$/, "").sub(/#{Regexp.quote trace_line}:\s*/, "").sub("\n", " - ")
609
619
  end
@@ -217,15 +217,15 @@ module Bundler
217
217
  end
218
218
 
219
219
  class InsecureInstallPathError < BundlerError
220
- def initialize(path)
220
+ def initialize(name, path)
221
+ @name = name
221
222
  @path = path
222
223
  end
223
224
 
224
225
  def message
225
- "The installation path is insecure. Bundler cannot continue.\n" \
226
- "#{@path} is world-writable (without sticky bit).\n" \
227
- "Bundler cannot safely replace gems in world-writeable directories due to potential vulnerabilities.\n" \
228
- "Please change the permissions of this directory or choose a different install path."
226
+ "Bundler cannot reinstall #{@name} because there's a previous installation of it at #{@path} that is unsafe to remove.\n" \
227
+ "The parent of #{@path} is world-writable and does not have the sticky bit set, making it insecure to remove due to potential vulnerabilities.\n" \
228
+ "Please change the permissions of #{File.dirname(@path)} or choose a different install path."
229
229
  end
230
230
 
231
231
  status_code(38)
@@ -244,4 +244,6 @@ module Bundler
244
244
 
245
245
  status_code(39)
246
246
  end
247
+
248
+ class InvalidArgumentError < BundlerError; status_code(40); end
247
249
  end
@@ -3,7 +3,7 @@
3
3
  require_relative "vendored_persistent"
4
4
  require_relative "vendored_timeout"
5
5
  require "cgi"
6
- require "securerandom"
6
+ require_relative "vendored_securerandom"
7
7
  require "zlib"
8
8
 
9
9
  module Bundler
@@ -182,7 +182,7 @@ module Bundler
182
182
  agent << " ci/#{cis.join(",")}" if cis.any?
183
183
 
184
184
  # add a random ID so we can consolidate runs server-side
185
- agent << " " << SecureRandom.hex(8)
185
+ agent << " " << Gem::SecureRandom.hex(8)
186
186
 
187
187
  # add any user agent strings set in the config
188
188
  extra_ua = Bundler.settings[:user_agent]
@@ -46,11 +46,9 @@ def gemfile(install = false, options = {}, &gemfile)
46
46
  Bundler::Plugin.gemfile_install(&gemfile) if Bundler.feature_flag.plugins?
47
47
  builder = Bundler::Dsl.new
48
48
  builder.instance_eval(&gemfile)
49
- builder.check_primary_source_safety
50
49
 
51
50
  Bundler.settings.temporary(deployment: false, frozen: false) do
52
51
  definition = builder.to_definition(nil, true)
53
- def definition.lock(*); end
54
52
  definition.validate_runtime!
55
53
 
56
54
  if install || definition.missing_specs?
@@ -62,8 +60,25 @@ def gemfile(install = false, options = {}, &gemfile)
62
60
  end
63
61
  end
64
62
 
65
- runtime = Bundler::Runtime.new(nil, definition)
66
- runtime.setup.require
63
+ begin
64
+ runtime = Bundler::Runtime.new(nil, definition).setup
65
+ rescue Gem::LoadError => e
66
+ name = e.name
67
+ version = e.requirement.requirements.first[1]
68
+ activated_version = Gem.loaded_specs[name].version
69
+
70
+ Bundler.ui.info \
71
+ "The #{name} gem was resolved to #{version}, but #{activated_version} was activated by Bundler while installing it, causing a conflict. " \
72
+ "Bundler will now retry resolving with #{activated_version} instead."
73
+
74
+ builder.dependencies.delete_if {|d| d.name == name }
75
+ builder.instance_eval { gem name, activated_version }
76
+ definition = builder.to_definition(nil, true)
77
+
78
+ retry
79
+ end
80
+
81
+ runtime.require
67
82
  end
68
83
  end
69
84
 
@@ -2,14 +2,15 @@
2
2
 
3
3
  module Bundler
4
4
  class GemInstaller
5
- attr_reader :spec, :standalone, :worker, :force, :installer
5
+ attr_reader :spec, :standalone, :worker, :force, :local, :installer
6
6
 
7
- def initialize(spec, installer, standalone = false, worker = 0, force = false)
7
+ def initialize(spec, installer, standalone = false, worker = 0, force = false, local = false)
8
8
  @spec = spec
9
9
  @installer = installer
10
10
  @standalone = standalone
11
11
  @worker = worker
12
12
  @force = force
13
+ @local = local
13
14
  end
14
15
 
15
16
  def install_from_spec
@@ -54,6 +55,7 @@ module Bundler
54
55
  spec.source.install(
55
56
  spec,
56
57
  force: force,
58
+ local: local,
57
59
  build_args: Array(spec_settings),
58
60
  previous_spec: previous_spec,
59
61
  )
@@ -68,11 +68,12 @@ module Bundler
68
68
 
69
69
  attr_reader :size
70
70
 
71
- def initialize(installer, all_specs, size, standalone, force, skip: nil)
71
+ def initialize(installer, all_specs, size, standalone, force, local: false, skip: nil)
72
72
  @installer = installer
73
73
  @size = size
74
74
  @standalone = standalone
75
75
  @force = force
76
+ @local = local
76
77
  @specs = all_specs.map {|s| SpecInstallation.new(s) }
77
78
  @specs.each do |spec_install|
78
79
  spec_install.state = :installed if skip.include?(spec_install.name)
@@ -127,7 +128,7 @@ module Bundler
127
128
  def do_install(spec_install, worker_num)
128
129
  Plugin.hook(Plugin::Events::GEM_BEFORE_INSTALL, spec_install)
129
130
  gem_installer = Bundler::GemInstaller.new(
130
- spec_install.spec, @installer, @standalone, worker_num, @force
131
+ spec_install.spec, @installer, @standalone, worker_num, @force, @local
131
132
  )
132
133
  success, message = gem_installer.install_from_spec
133
134
  if success
@@ -194,9 +194,14 @@ module Bundler
194
194
  # that said, it's a rare situation (other than rake), and parallel
195
195
  # installation is SO MUCH FASTER. so we let people opt in.
196
196
  def install(options)
197
- force = options["force"]
197
+ standalone = options[:standalone]
198
+ force = options[:force]
199
+ local = options[:local]
198
200
  jobs = installation_parallelization(options)
199
- install_in_parallel jobs, options[:standalone], force
201
+ spec_installations = ParallelInstaller.call(self, @definition.specs, jobs, standalone, force, local: local)
202
+ spec_installations.each do |installation|
203
+ post_install_messages[installation.name] = installation.post_install_message if installation.has_post_install_message?
204
+ end
200
205
  end
201
206
 
202
207
  def installation_parallelization(options)
@@ -238,18 +243,11 @@ module Bundler
238
243
  end
239
244
  end
240
245
 
241
- def install_in_parallel(size, standalone, force = false)
242
- spec_installations = ParallelInstaller.call(self, @definition.specs, size, standalone, force)
243
- spec_installations.each do |installation|
244
- post_install_messages[installation.name] = installation.post_install_message if installation.has_post_install_message?
245
- end
246
- end
247
-
248
246
  # returns whether or not a re-resolve was needed
249
247
  def resolve_if_needed(options)
250
- @definition.prefer_local! if options["prefer-local"]
248
+ @definition.prefer_local! if options[:"prefer-local"]
251
249
 
252
- if options["local"] || (@definition.no_resolve_needed? && !@definition.missing_specs?)
250
+ if options[:local] || (@definition.no_resolve_needed? && !@definition.missing_specs?)
253
251
  @definition.resolve_with_cache!
254
252
  false
255
253
  else
@@ -1,24 +1,12 @@
1
1
  .\" generated with nRonn/v0.11.1
2
2
  .\" https://github.com/n-ronn/nronn/tree/0.11.1
3
- .TH "BUNDLE\-ADD" "1" "June 2024" ""
3
+ .TH "BUNDLE\-ADD" "1" "September 2024" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-add\fR \- Add gem to the Gemfile and run bundle install
6
6
  .SH "SYNOPSIS"
7
- \fBbundle add\fR \fIGEM_NAME\fR [\-\-group=GROUP] [\-\-version=VERSION] [\-\-source=SOURCE] [\-\-path=PATH] [\-\-git=GIT] [\-\-github=GITHUB] [\-\-branch=BRANCH] [\-\-ref=REF] [\-\-skip\-install] [\-\-strict] [\-\-optimistic]
7
+ \fBbundle add\fR \fIGEM_NAME\fR [\-\-group=GROUP] [\-\-version=VERSION] [\-\-source=SOURCE] [\-\-path=PATH] [\-\-git=GIT|\-\-github=GITHUB] [\-\-branch=BRANCH] [\-\-ref=REF] [\-\-skip\-install] [\-\-strict|\-\-optimistic]
8
8
  .SH "DESCRIPTION"
9
- Adds the named gem to the Gemfile and run \fBbundle install\fR\. \fBbundle install\fR can be avoided by using the flag \fB\-\-skip\-install\fR\.
10
- .P
11
- Example:
12
- .P
13
- bundle add rails
14
- .P
15
- bundle add rails \-\-version "< 3\.0, > 1\.1"
16
- .P
17
- bundle add rails \-\-version "~> 5\.0\.0" \-\-source "https://gems\.example\.com" \-\-group "development"
18
- .P
19
- bundle add rails \-\-skip\-install
20
- .P
21
- bundle add rails \-\-group "development, test"
9
+ Adds the named gem to the [\fBGemfile(5)\fR][Gemfile(5)] and run \fBbundle install\fR\. \fBbundle install\fR can be avoided by using the flag \fB\-\-skip\-install\fR\.
22
10
  .SH "OPTIONS"
23
11
  .TP
24
12
  \fB\-\-version\fR, \fB\-v\fR
@@ -56,4 +44,27 @@ Adds optimistic declaration of version\.
56
44
  .TP
57
45
  \fB\-\-strict\fR
58
46
  Adds strict declaration of version\.
59
-
47
+ .SH "EXAMPLES"
48
+ .IP "1." 4
49
+ You can add the \fBrails\fR gem to the Gemfile without any version restriction\. The source of the gem will be the global source\.
50
+ .IP
51
+ \fBbundle add rails\fR
52
+ .IP "2." 4
53
+ You can add the \fBrails\fR gem with version greater than 1\.1 (not including 1\.1) and less than 3\.0\.
54
+ .IP
55
+ \fBbundle add rails \-\-version "> 1\.1, < 3\.0"\fR
56
+ .IP "3." 4
57
+ You can use the \fBhttps://gems\.example\.com\fR custom source and assign the gem to a group\.
58
+ .IP
59
+ \fBbundle add rails \-\-version "~> 5\.0\.0" \-\-source "https://gems\.example\.com" \-\-group "development"\fR
60
+ .IP "4." 4
61
+ The following adds the \fBgem\fR entry to the Gemfile without installing the gem\. You can install gems later via \fBbundle install\fR\.
62
+ .IP
63
+ \fBbundle add rails \-\-skip\-install\fR
64
+ .IP "5." 4
65
+ You can assign the gem to more than one group\.
66
+ .IP
67
+ \fBbundle add rails \-\-group "development, test"\fR
68
+ .IP "" 0
69
+ .SH "SEE ALSO"
70
+ Gemfile(5) \fIhttps://bundler\.io/man/gemfile\.5\.html\fR, bundle\-remove(1) \fIbundle\-remove\.1\.html\fR
@@ -1,26 +1,19 @@
1
1
  bundle-add(1) -- Add gem to the Gemfile and run bundle install
2
- ================================================================
2
+ ==============================================================
3
3
 
4
4
  ## SYNOPSIS
5
5
 
6
- `bundle add` <GEM_NAME> [--group=GROUP] [--version=VERSION] [--source=SOURCE] [--path=PATH] [--git=GIT] [--github=GITHUB] [--branch=BRANCH] [--ref=REF] [--skip-install] [--strict] [--optimistic]
6
+ `bundle add` <GEM_NAME> [--group=GROUP] [--version=VERSION] [--source=SOURCE]
7
+ [--path=PATH] [--git=GIT|--github=GITHUB] [--branch=BRANCH] [--ref=REF]
8
+ [--skip-install] [--strict|--optimistic]
7
9
 
8
10
  ## DESCRIPTION
9
- Adds the named gem to the Gemfile and run `bundle install`. `bundle install` can be avoided by using the flag `--skip-install`.
10
11
 
11
- Example:
12
-
13
- bundle add rails
14
-
15
- bundle add rails --version "< 3.0, > 1.1"
16
-
17
- bundle add rails --version "~> 5.0.0" --source "https://gems.example.com" --group "development"
18
-
19
- bundle add rails --skip-install
20
-
21
- bundle add rails --group "development, test"
12
+ Adds the named gem to the [`Gemfile(5)`][Gemfile(5)] and run `bundle install`.
13
+ `bundle install` can be avoided by using the flag `--skip-install`.
22
14
 
23
15
  ## OPTIONS
16
+
24
17
  * `--version`, `-v`:
25
18
  Specify version requirements(s) for the added gem.
26
19
 
@@ -56,3 +49,33 @@ bundle add rails --group "development, test"
56
49
 
57
50
  * `--strict`:
58
51
  Adds strict declaration of version.
52
+
53
+ ## EXAMPLES
54
+
55
+ 1. You can add the `rails` gem to the Gemfile without any version restriction.
56
+ The source of the gem will be the global source.
57
+
58
+ `bundle add rails`
59
+
60
+ 2. You can add the `rails` gem with version greater than 1.1 (not including 1.1) and less than 3.0.
61
+
62
+ `bundle add rails --version "> 1.1, < 3.0"`
63
+
64
+ 3. You can use the `https://gems.example.com` custom source and assign the gem
65
+ to a group.
66
+
67
+ `bundle add rails --version "~> 5.0.0" --source "https://gems.example.com" --group "development"`
68
+
69
+ 4. The following adds the `gem` entry to the Gemfile without installing the
70
+ gem. You can install gems later via `bundle install`.
71
+
72
+ `bundle add rails --skip-install`
73
+
74
+ 5. You can assign the gem to more than one group.
75
+
76
+ `bundle add rails --group "development, test"`
77
+
78
+ ## SEE ALSO
79
+
80
+ [Gemfile(5)](https://bundler.io/man/gemfile.5.html),
81
+ [bundle-remove(1)](bundle-remove.1.html)
@@ -1,6 +1,6 @@
1
1
  .\" generated with nRonn/v0.11.1
2
2
  .\" https://github.com/n-ronn/nronn/tree/0.11.1
3
- .TH "BUNDLE\-BINSTUBS" "1" "June 2024" ""
3
+ .TH "BUNDLE\-BINSTUBS" "1" "September 2024" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-binstubs\fR \- Install the binstubs of the listed gems
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with nRonn/v0.11.1
2
2
  .\" https://github.com/n-ronn/nronn/tree/0.11.1
3
- .TH "BUNDLE\-CACHE" "1" "June 2024" ""
3
+ .TH "BUNDLE\-CACHE" "1" "September 2024" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-cache\fR \- Package your needed \fB\.gem\fR files into your application
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with nRonn/v0.11.1
2
2
  .\" https://github.com/n-ronn/nronn/tree/0.11.1
3
- .TH "BUNDLE\-CHECK" "1" "June 2024" ""
3
+ .TH "BUNDLE\-CHECK" "1" "September 2024" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-check\fR \- Verifies if dependencies are satisfied by installed gems
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with nRonn/v0.11.1
2
2
  .\" https://github.com/n-ronn/nronn/tree/0.11.1
3
- .TH "BUNDLE\-CLEAN" "1" "June 2024" ""
3
+ .TH "BUNDLE\-CLEAN" "1" "September 2024" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-clean\fR \- Cleans up unused gems in your bundler directory
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with nRonn/v0.11.1
2
2
  .\" https://github.com/n-ronn/nronn/tree/0.11.1
3
- .TH "BUNDLE\-CONFIG" "1" "June 2024" ""
3
+ .TH "BUNDLE\-CONFIG" "1" "September 2024" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-config\fR \- Set bundler configuration options
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with nRonn/v0.11.1
2
2
  .\" https://github.com/n-ronn/nronn/tree/0.11.1
3
- .TH "BUNDLE\-CONSOLE" "1" "June 2024" ""
3
+ .TH "BUNDLE\-CONSOLE" "1" "September 2024" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-console\fR \- Deprecated way to open an IRB session with the bundle pre\-loaded
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with nRonn/v0.11.1
2
2
  .\" https://github.com/n-ronn/nronn/tree/0.11.1
3
- .TH "BUNDLE\-DOCTOR" "1" "June 2024" ""
3
+ .TH "BUNDLE\-DOCTOR" "1" "September 2024" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-doctor\fR \- Checks the bundle for common problems
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with nRonn/v0.11.1
2
2
  .\" https://github.com/n-ronn/nronn/tree/0.11.1
3
- .TH "BUNDLE\-EXEC" "1" "June 2024" ""
3
+ .TH "BUNDLE\-EXEC" "1" "September 2024" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-exec\fR \- Execute a command in the context of the bundle
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with nRonn/v0.11.1
2
2
  .\" https://github.com/n-ronn/nronn/tree/0.11.1
3
- .TH "BUNDLE\-GEM" "1" "June 2024" ""
3
+ .TH "BUNDLE\-GEM" "1" "September 2024" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-gem\fR \- Generate a project skeleton for creating a rubygem
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with nRonn/v0.11.1
2
2
  .\" https://github.com/n-ronn/nronn/tree/0.11.1
3
- .TH "BUNDLE\-HELP" "1" "June 2024" ""
3
+ .TH "BUNDLE\-HELP" "1" "September 2024" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-help\fR \- Displays detailed help for each subcommand
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with nRonn/v0.11.1
2
2
  .\" https://github.com/n-ronn/nronn/tree/0.11.1
3
- .TH "BUNDLE\-INFO" "1" "June 2024" ""
3
+ .TH "BUNDLE\-INFO" "1" "September 2024" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-info\fR \- Show information for the given gem in your bundle
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with nRonn/v0.11.1
2
2
  .\" https://github.com/n-ronn/nronn/tree/0.11.1
3
- .TH "BUNDLE\-INIT" "1" "June 2024" ""
3
+ .TH "BUNDLE\-INIT" "1" "September 2024" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-init\fR \- Generates a Gemfile into the current working directory
6
6
  .SH "SYNOPSIS"