2

我试图了解它的bundle exec工作原理和作用。我已经使用bundle install这样的方式安装了 gem:

bundle install --binstubs ./bundle/bin --path ./bundle/lib'

这将创建一个脚本./bundle/bin/thin,我可以使用它来启动我的 Rails 应用程序,thin如下所示:

./bundle/bin/thin start -p 8080

但是,我看到互联网上的大多数文章都建议使用bundle exec以下方法开始瘦身:

bundle exec thin start -p 8080

两者有什么区别?我的测试表明它bundle exec不会调用./bundle/bin/thin脚本,那么bundle exec与脚本有什么不同呢?

4

3 回答 3

3

没有显着区别:它们是完成相同事情的两种方法,即为您的包运行正确版本的命令,并设置环境以确保该命令可以加载其他捆绑的 gens。选择归结为方便问题。

这样做的好处bundle exec是你不需要生成 binstubs 来使用它:它只适用于现有的 Gemfile。这解释了为什么您没有看到它调用您拥有的 binstub。

有些人不喜欢bundle exec在每个命令之前都键入,所以 binstubs 的目标是您可以将目录添加到 PATH 的前面并正常调用命令。缺点是,如果捆绑的 gem 包含隐藏重要系统命令的命令(例如,ls),则存在潜在的安全性或可用性问题。

如果你不把它放在你的 PATH 中并且总是把它称为bundle/bin/thin,你没有安全问题,但它也没有给你带来比使用bundle exec thin.

于 2013-08-02T06:47:08.200 回答
1

在那种特定情况下,没有区别。bundle exec thin start -p 8080最终会调用.bundle/bin/thin,但是如果您在不同的路径中安装了 binstubs 怎么办?bundle exec thin start将阅读您的内容.bundle/config以找到您的 binstubs 文件夹在哪里。如果您没有安装 binstubs 并说您安装了 3 个瘦版本,bundle exec则将执行 Gemfile 中定义的版本。

编辑:@tadman 也提出了一个我最初错过的好观点。使用时bundle exec,将使用 Gemfile 中的 gem 环境,没有它,它将加载当前安装的每个 gem 的最新版本。

于 2013-08-01T20:57:22.347 回答
0

bundle exec方法是执行此操作的“官方”方法。如果您想使用该--binstubs功能,这是不寻常的,您可以。

请记住,这./bundle/bin/thin不是脚本,而是一个包装器或“存根”,它调用bundle exec加载了适当环境的脚本。

于 2013-08-01T20:57:26.563 回答