bundle exec rake是什么意思?

JnB*_*ymn 343 rake ruby-on-rails bundler

什么bundle exec rake db:migrate意思?或者只是bundle exec rake <command>一般?

据我所知,bundle它负责维护Gemfile中的内容.我知道"exec"这个词是什么意思.我明白,rake你可以保留所有不同的脚本,我知道这db:migrate就是其中之一.我只是不知道这些话在一起做什么.为什么要bundle用来rake执行数据库迁移?

gho*_*ppe 461

bundle exec是一个Bundler命令,用于在当前包(您目录的Gemfile中的一个)的上下文中执行脚本.rake db:migratedb是命名空间的脚本,migrate是定义的任务名称.

因此,在当前包的上下文中bundle exec rake db:migrate使用命令执行rake脚本db:migrate.

至于"为什么?" 我将从捆绑页面引用:

在某些情况下,bundle exec如果可执行文件恰好安装在您的系统中并且没有引入任何与您的软件包冲突的gem,那么运行可执行文件可能无效.

然而,这是不可靠的,并且是相当痛苦的根源.即使看起来它有效,它可能在将来或在另一台机器上不起作用.

  • @Edmund"捆绑"是一个英文单词,意思是一组相似的东西,通常整齐地捆绑在一起.特别是在这个问题中,它指的是一组Gems(自包含的ruby代码库.)[Bundler](http://gembundler.com/)是我们在这里用来管理Gems的软件的名称.而`bundle`是Bundler使用的命令. (11认同)
  • 这是否意味着我们应该始终运行bundle exec,我已经使用ruby版本管理器在rails上安装ruby和ruby. (7认同)
  • 谢谢,非常有教育意义. (3认同)
  • 我的印象是每当我们使用Gemfile cd到一个文件夹时,shell都会自动使用Gemfile中指定的版本(例如Ruby版本).根据这个假设,我认为rake db:migrate在没有bundle exec的情况下总能正常运行.CMIIW (2认同)

Ros*_*one 148

你正在运行bundle exec一个程序.该程序的创建者在某些版本的宝石可用时编写了它.程序Gemfile指定创建者决定使用的gem的版本.也就是说,脚本可以针对这些gem版本正确运行.

您的系统范围的Gemfile可能与此Gemfile不同.你可能有更新或更旧的宝石,这个脚本不能很好地运行.版本的这种差异可以给你带来奇怪的错误.

bundle exec帮助您避免这些错误.它使用脚本的Gemfile中指定的gem而不是系统范围的Gemfile来执行脚本.它使用shell别名的魔力执行某些gem版本.

请参见手册页.

这是Gemfile的一个例子:

source 'http://rubygems.org'

gem 'rails', '2.8.3'
Run Code Online (Sandbox Code Playgroud)

在这里,bundle exec将使用rails版本2.8.3执行脚本,而不是您可能已在系统范围内安装的其他版本.

  • 我比OP的选择更喜欢这个答案:D!更清楚. (9认同)
  • 因此,`bundle exec` 使用应用程序 Gemfile 中的“特定于应用程序”的本地 gem,如果您执行了 `gem install a_certain_gem`,`bundle` 使用“特定于机器的”全局 gem。本地与全球 (2认同)

Ben*_*phy 8

当你的gemfile.lock在你的机器上安装了不同版本的gem时,会出现这种情况.运行rake(或rspec或其他)后,您可能会收到警告,例如:

You have already activated rake 10.3.1, but your Gemfile requires rake 10.1.0. Prepending "bundle exec" to your command may solve this.

bundle exec无论版本差异如何,Prepending都会告诉bundler执行此命令.但是,并不总是存在问题,您可能会遇到问题.

幸运的是,有一个宝石可以解决这个问题:rubygems-bundler.

$ gem install rubygems-bundler

$ $ gem regenerate_binstubs

然后尝试你的耙子,rspec或其他任何东西.


tsc*_*ale 6

应该提到的是,有一些方法可以省略bundle exec(它们都在Michael Hartls Ruby on Rails Tutorial一书的第3.6.1章中说明).

最简单的方法是使用足够最新版本的RVM(> = 1.11.x).

如果您仅限于早期版本的RVM,则可以始终使用calasyr也提到的此方法:

$ rvm get head && rvm reload
$ chmod +x $rvm_path/hooks/after_cd_bundler
$ bundle install --binstubs=./bundler_stubs
Run Code Online (Sandbox Code Playgroud)

bundler_stubs然后,该目录也应添加到该.gitignore文件中.

第三种选择是rubygems-bundler在不使用RVM的情况下使用gem:

$ gem install rubygems-bundler
$ gem regenerate_binstubs
Run Code Online (Sandbox Code Playgroud)