我试图理解bundle exec
如何运作以及它的作用。我已经使用bundle install
安装了宝石,如下所示:
bundle install --binstubs ./bundle/bin --path ./bundle/lib'
这会创建一个脚本./bundle/bin/thin
,我可以使用thin
来启动我的Rails应用程序,如下所示:
./bundle/bin/thin start -p 8080
但是我看到互联网上的大多数文章建议使用bundle exec
这样开始瘦:
bundle exec thin start -p 8080
两者有什么区别?我的测试表明bundle exec
没有调用./bundle/bin/thin
脚本,那么bundle exec
与脚本的区别如何?
答案 0 :(得分:3)
没有显着差异:他们有两种方法可以完成同样的事情,即为您的捆绑包运行正确的命令版本,并设置环境以确保其他捆绑的一族可以通过命令加载。选择归结为方便。
bundle exec
的好处是您不需要生成binstub来使用它:它只适用于现有的Gemfile。这就解释了为什么你没有看到它调用你所拥有的binstub。
有些人不喜欢在每个命令之前输入bundle exec
,所以binstubs的目标是你可以将目录添加到PATH的前面并正常调用命令。缺点是如果捆绑的gem包含影响重要系统命令的命令(例如ls
),则存在潜在的安全性或可用性问题。
如果你没有把它放在你的PATH中并且总是把它称为bundle/bin/thin
,你就不会有安全问题,但它也没有使用{{1 }}
答案 1 :(得分:1)
在这种特定情况下,没有区别。 bundle exec thin start -p 8080
最终会调用.bundle/bin/thin
,但如果您在其他路径中安装了binstub,该怎么办? bundle exec thin start
会读取您的.bundle/config
以查找您的binstubs文件夹所在的位置。如果您没有安装binstub并且说您安装了3个瘦版本,bundle exec
将执行Gemfile中定义的版本。
编辑:@tadman也提出了一个很好的观点,我最初错过了。使用bundle exec
时,将使用Gemfile中的gem环境,如果没有它,它将加载当前安装的每个gem的最新版本。
答案 2 :(得分:0)
bundle exec
方法是"官方"这样做的方式。如果您想使用--binstubs
功能,这是不寻常的,您可以。
请记住,./bundle/bin/thin
不是脚本,而是包装器或"存根"调用加载了正确bundle exec
环境的脚本。