捆绑exec thin start vs ./bundle/bin/thin start

时间:2013-08-01 20:44:35

标签: ruby bundler

我试图理解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与脚本的区别如何?

3 个答案:

答案 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环境的脚本。