如果您从 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
。