如何将旧版本的 Bundler 用于 Ruby 项目?

How can I use an older version of Bundler for a Ruby project?

...无需卸载最新版本。

我正在开发一个使用 Bundler 1.10 的项目,但我在所有其他项目中使用 Bundler 1.11。由于这个项目是在 1.10 上,每当我 运行 任何 bundle 命令时,我的 Gemfile.lock 由于 Bundler 1.11 引入的不同格式而改变。

到目前为止我找到的唯一解决方案是 运行 像这样设置我的所有命令:

bundle _1.10.6_ [command]

(来自这里的答案:)

有没有更好的方法?我正在使用 rbenv,而不是 rvm。

您可以使用 the rbenv-gemset plugin。由于 rbenv gemset 中的旧版本 gem 不会覆盖默认 gemset 中的较新版本,因此您需要为每个项目安装 bundler,即比较麻烦。

  • 安装插件 (cd ~/.rbenv/plugins; git clone git://github.com/jf/rbenv-gemset.git) 或者,如果您使用自制软件,brew install rbenv-gemset
  • gem uninstall -xI bundler
  • 对于每个可以使用 bundler 1.11 的项目,
    • cd 到项目
    • echo bundler-1.11 > .rbenv-gemsets("bundler-1.11"是gem集合的名称)
  • 在其中一个项目中,gem install bundler 获取当前版本 1.11.*
  • 对于需要bundler 1.10的项目,
    • cd 到项目
    • echo bundler-1.10 > .rbenv-gemsets("bundler-1.10"是gem集合的名称)
    • gem install bundler -v 1.10.6

我最终用别名和 bash 函数解决了这个问题。在我的 ~/.bashrc 中,我添加了这个:

versioned_bundle() {
  version_file=${PWD}/.bundle/version
  if [[ -r $version_file ]]; then
    version=$(<$version_file)
    bundle _${version}_ "$@"
  else
    bundle "$@"
  fi
}
alias bundle=versioned_bundle

正如你从代码中猜到的那样,我还在我的项目中的.bundle/目录中添加了一个version文件。该文件的内容:

1.10.6

每当我 运行 bundle 时,我的 shell 检查当前目录中的版本文件,如果找到它,运行 就是那个版本的包.

$ cd project-with-old-bundle-version
$ bundle --version
1.10.6
$ cd anywhere-else
$ bundle --version
1.11.2