rbenv:在垫片中嵌入“捆绑exec”调用是否安全?

时间:2012-05-11 19:56:43

标签: ruby bundler rbenv

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

当当前目录中存在Gemfile时,让rbenv填充运行“bundle exec”有什么缺点吗?这是一种有点幼稚的方法,因为它不处理目录树中的Gemfile,但我不需要这种行为。此更改还将确保当前填充程序未命名为“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

要测试补丁,您必须删除填充程序并运行“rbenv rehash”。

撤消:

git apply -R PATCHFILE

git checkout -- libexec/rbenv-rehash
然后再次重新创建垫片。

看起来vim在加载ruby文件时会运行一些ruby,而bundle exec也会用到它。您可以通过let $RBENV_AUTO_BUNDLE=0停用自动行为。

1 个答案:

答案 0 :(得分:2)

  

如果你正在运行,rbenv要求你手动运行“bundle exec”   来自gem的可执行文件,以避免加载其中的不同版本   gem与你的Gemfile比较。

除非你使用rbenv-bundler插件,否则恕我直言的方法比尝试自己重新实现这种行为更安全。如果该插件中缺少任何内容,请在那里做出贡献。