@@ -67,17 +67,15 @@ export async function installBundler(bundlerVersionInput, rubygemsInputSet, lock
6767 }
6868 }
6969
70- const floatVersion = common.floatVersion(rubyVersion)
71-
7270 if (bundlerVersion === 'default') {
73- if (common.isBundler2dot2Default (engine, rubyVersion)) {
71+ if (common.isBundler2dot2PlusDefault (engine, rubyVersion)) {
7472 if (common.windows && engine === 'ruby' && (common.isStableVersion(engine, rubyVersion) || rubyVersion === 'head')) {
7573 // https://github.com/ruby/setup-ruby/issues/371
7674 console.log(`Installing latest Bundler for ${engine}-${rubyVersion} on Windows because bin/bundle does not work in bash otherwise`)
7775 bundlerVersion = 'latest'
7876 } else {
79- console.log(`Using Bundler 2 shipped with ${engine}-${rubyVersion}`)
80- return '2 '
77+ console.log(`Using Bundler shipped with ${engine}-${rubyVersion}`)
78+ return 'default '
8179 }
8280 } else if (common.hasBundlerDefaultGem(engine, rubyVersion)) {
8381 // Those Rubies have a old Bundler default gem < 2.2 which does not work well for `gem 'foo', github: 'foo/foo'`:
@@ -90,8 +88,15 @@ export async function installBundler(bundlerVersionInput, rubygemsInputSet, lock
9088 }
9189 }
9290
91+ const targetRubyVersion = common.targetRubyVersion(engine, rubyVersion)
92+
9393 if (bundlerVersion === 'latest') {
94- bundlerVersion = '2'
94+ // Bundler 4 requires Ruby 3.2+
95+ if (targetRubyVersion < 3.2) {
96+ bundlerVersion = '2'
97+ } else {
98+ bundlerVersion = '4'
99+ }
95100 }
96101
97102 if (isValidBundlerVersion(bundlerVersion)) {
@@ -100,24 +105,29 @@ export async function installBundler(bundlerVersionInput, rubygemsInputSet, lock
100105 throw new Error(`Cannot parse bundler input: ${bundlerVersion}`)
101106 }
102107
103- // Use Bundler 1 when we know Bundler 2 does not work
104- if (bundlerVersion.startsWith('2')) {
105- if (engine === 'ruby' && floatVersion <= 2.2) {
106- console.log('Bundler 2 requires Ruby 2.3+, using Bundler 1 on Ruby <= 2.2')
108+ // Only use Bundler 4 on Ruby 3.2+
109+ if (common.floatVersion(bundlerVersion) >= 4 && targetRubyVersion < 3.2) {
110+ console.log('Bundler 4 requires Ruby 3.2+, using Bundler 2 instead on Ruby < 3.2')
111+ bundlerVersion = '2'
112+ }
113+
114+ // Use Bundler 1 when we know Bundler 2+ does not work
115+ if (common.floatVersion(bundlerVersion) >= 2) {
116+ if (engine === 'ruby' && targetRubyVersion <= 2.2) {
117+ console.log(`Bundler 2+ requires Ruby 2.3+, using Bundler 1 on Ruby <= 2.2`)
107118 bundlerVersion = '1'
108119 } else if (engine === 'ruby' && /^2\.3\.[01]/.test(rubyVersion)) {
109120 console.log('Ruby 2.3.0 and 2.3.1 have shipped with an old rubygems that only works with Bundler 1')
110121 bundlerVersion = '1'
111122 } else if (engine === 'jruby' && rubyVersion.startsWith('9.1')) { // JRuby 9.1 targets Ruby 2.3, treat it the same
112- console.log('JRuby 9.1 has a bug with Bundler 2 (https://github.com/ruby/setup-ruby/issues/108), using Bundler 1 instead on JRuby 9.1')
123+ console.log('JRuby 9.1 has a bug with Bundler 2+ (https://github.com/ruby/setup-ruby/issues/108), using Bundler 1 instead on JRuby 9.1')
113124 bundlerVersion = '1'
114125 }
115126 }
116127
117- const targetRubyVersion = common.targetRubyVersion(engine, rubyVersion)
118128 // Use Bundler 2.3 when we use Ruby 2.3.2 - 2.5
119129 // Use Bundler 2.4 when we use Ruby 2.6-2.7
120- if (bundlerVersion == '2') {
130+ if (bundlerVersion === '2') {
121131 if (targetRubyVersion <= 2.5) { // < 2.3.2 already handled above
122132 console.log('Ruby 2.3.2 - 2.5 only works with Bundler 2.3')
123133 bundlerVersion = '2.3'
@@ -144,8 +154,8 @@ export async function bundleInstall(gemfile, lockFile, platform, engine, rubyVer
144154 }
145155
146156 let envOptions = {}
147- if (bundlerVersion.startsWith('1') && common.isBundler2Default (engine, rubyVersion)) {
148- // If Bundler 1 is specified on Rubies which ship with Bundler 2,
157+ if (bundlerVersion.startsWith('1') && common.isBundler2PlusDefault (engine, rubyVersion)) {
158+ // If Bundler 1 is specified on Rubies which ship with Bundler 2+ ,
149159 // we need to specify which Bundler version to use explicitly until the lockfile exists.
150160 console.log(`Setting BUNDLER_VERSION=${bundlerVersion} for "bundle config|lock" commands below to ensure Bundler 1 is used`)
151161 envOptions = { env: { ...process.env, BUNDLER_VERSION: bundlerVersion } }
@@ -156,10 +166,10 @@ export async function bundleInstall(gemfile, lockFile, platform, engine, rubyVer
156166 // An absolute path, so it is reliably under $PWD/vendor/bundle, and not relative to the gemfile's directory
157167 const bundleCachePath = path.join(process.cwd(), cachePath)
158168
159- await exec.exec('bundle', ['config', '--local', 'path', bundleCachePath], envOptions)
169+ await exec.exec('bundle', ['config', 'set', ' --local', 'path', bundleCachePath], envOptions)
160170
161171 if (fs.existsSync(lockFile)) {
162- await exec.exec('bundle', ['config', '--local', 'deployment', 'true'], envOptions)
172+ await exec.exec('bundle', ['config', 'set', ' --local', 'deployment', 'true'], envOptions)
163173 } else {
164174 // Generate the lockfile so we can use it to compute the cache key.
165175 // This will also automatically pick up the latest gem versions compatible with the Gemfile.
0 commit comments