1

如果您从 gem 运行可执行文件,rbenv 要求您手动运行“bundle exec”,以避免加载与 Gemfile 相比不同版本的 gem。

当当前目录中存在 Gemfile 时,让 rbenv 垫片运行“bundle exec”有什么缺点吗?这是一种有点幼稚的方法,因为它不处理位于目录树上方的 Gemfile,但我不需要这种行为。该更改还将确保当前 shim 未命名为“bundle”,否则可能存在无限递归。

修补:

diff --git a/libexec/rbenv-rehash b/libexec/rbenv-rehash
index eebc4d3..00f4ec0 100755
--- a/libexec/rbenv-rehash
+++ b/libexec/rbenv-rehash
@@ -38,7 +38,14 @@ create_prototype_shim() {
 #!/usr/bin/env bash
 set -e
 export RBENV_ROOT="$RBENV_ROOT"
-exec rbenv exec "\${0##*/}" "\$@"
+# This only handles Gemfile in current dir
+if [[ \$RBENV_AUTO_BUNDLE = '1' && -e Gemfile && \`basename \$0\` != 'bundle' ]]; then
+  exec 3>/dev/tty
+  echo "rbenv: Using Gemfile" >&3
+  exec rbenv exec bundle exec "\${0##*/}" "\$@"
+else
+  exec rbenv exec "\${0##*/}" "\$@"
+fi
 SH
   chmod +x "$PROTOTYPE_SHIM_PATH"
 }

您必须设置环境变量 RBENV_AUTO_BUNDLE=1 以启用自动“捆绑执行”行为。

如果有足够的需求,我可能会提交一个补丁。

要应用补丁,只需将补丁文件放在您的 .rbenv 目录中,然后运行

git apply PATCHFILE

要测试补丁,您必须删除 shim 并运行“rbenv rehash”。

撤销:

git apply -R PATCHFILE

或者

git checkout -- libexec/rbenv-rehash

然后重新创建垫片。

当您加载 ruby​​ 文件时,vim 似乎会运行一些 ruby​​,并且 bundle exec 也将与它一起使用。您可以通过禁用自动行为let $RBENV_AUTO_BUNDLE=0

4

1 回答 1

2

如果您从 gem 运行可执行文件,rbenv 要求您手动运行“bundle exec”,以避免加载与 Gemfile 相比不同版本的 gem。

除非您使用rbenv-bundler插件,恕我直言,这是一种比尝试自己重新实现该行为更明智的方法。如果该插件缺少任何内容,请在此处提供。

于 2012-05-14T17:59:15.607 回答