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

mag*_*ni- 5 ruby rubygems bundler rbenv

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

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

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

bundle _1.10.6_ [command]
Run Code Online (Sandbox Code Playgroud)

(来自这里的答案:https : //stackoverflow.com/a/4373478/1612744

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

Dav*_*uth 5

您可以使用rbenv-gemset 插件。由于 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 install bundler要获取当前版本,请使用 1.11.*
  • 对于需要bundler 1.10的项目,
    • cd 到项目
    • echo bundler-1.10 > .rbenv-gemsets (“bundler-1.10”是宝石集的名称)
    • gem install bundler -v 1.10.6


mag*_*ni- 5

我最终用别名和 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
Run Code Online (Sandbox Code Playgroud)

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

1.10.6
Run Code Online (Sandbox Code Playgroud)

每当我运行 时bundle,我的 shell 都会检查当前目录中的版本文件,如果找到它,则运行该版本的捆绑包。

$ cd project-with-old-bundle-version
$ bundle --version
1.10.6
$ cd anywhere-else
$ bundle --version
1.11.2
Run Code Online (Sandbox Code Playgroud)