rake 和 bin/rake 的区别

Posted

技术标签:

【中文标题】rake 和 bin/rake 的区别【英文标题】:Difference between rake and bin/rake 【发布时间】:2014-09-04 14:33:35 【问题描述】:

谁能解释以下命令之间的区别?

rake assets:precompile

bin/rake assets:precompile

RAILS_ENV=production rake assets:precompile

RAILS_ENV=production bin/rake assets:precompile

【问题讨论】:

一个明确地在 bin 中运行 rake。一个没有。两个将环境设置为生产环境,另外两个不设置(例如,使用默认开发环境)。 “以二进制运行 rake”是什么意思? 什么都没有;我说“在 bin 中运行耙子”。 bin 是(假定是)当前目录中的子目录。对bin/rake 的调用显式运行bin 目录中包含的rake 命令。调用rake 运行 rake 命令,无论它在哪里,或者在哪里。 【参考方案1】:

rakebin/rake 都是用于引导 Rake gem 的可执行 Ruby 文件。 rake 是您的环境对 Rake gem 的默认调用,它是在您安装 Rake 时由 RubyGems 创建的。它应该位于您的 PATH 中的某个位置:

[jkrause:~] $ which rake
/usr/bin/rake

或者,如果您使用的是 RVM 等版本管理器(您应该这样做):

[jkrause:~] $ which rake
/Users/jkrause/.rvm/rubies/ruby-2.2.0/bin/rake

另一方面,bin/rake 是在您创建新的 Rails 应用程序时由 Rails 创建的,位于 Rails 应用根目录下的 bin 目录中:

[jkrause:~] $ ls -la ~/src/my_rails_app/bin/rake
-rwxr-xr-x  1 jkrause  staff  164 Jan  5 14:11 bin/rake

在旧版本的 Rails(3.x 和更早版本)中,bin/rake 不存在,因此标准做法是调用 RubyGems 安装的默认 rake。在 Rails 4.x 中,您需要调用 bin/rake,因为 Rails 需要在您调用 Rake 之前更改环境并加载一些辅助 gem。老实说,我仍然出于习惯不时执行rake,而且我从未见过有任何问题,但开始使用bin/rake 可能是个好主意,因为Rails 指南明确表明了这一点。

最后,RAILS_ENV 用于设置rakebin/rake 的特定执行应该使用哪个Rails 环境(开发、测试或生产)。

【讨论】:

【参考方案2】: rakebin/rake

Rake 是您安装在计算机上的程序。要在终端中使用它,请使用rake do:something。直接使用rake 意味着已经创建了一个快捷方式,别名是“当我输入rake 我想使用位于[...] 中的程序”。

bin/rake 样式不是使用创建的别名而是使用程序的路径。通常程序的执行器(不是程序的内容,只是启动器)位于文件夹/bin/。要确定特定程序的完整路径,请使用which

[yoshiji:~] $ which rake
/home/yoshiji/.rvm/gems/ruby-1.9.3-head@yourproject/bin/rake
[yoshiji:~] $ which ls
/bin/ls
RAILS_ENV=production rake do:something

RAILS_ENV 部分用于指定 Rails 在运行 rake 命令时应加载的环境。默认环境为development


总结一下:

rake assets:precompile :使用别名/快捷方式 rake /bin/rake assets:precompile :使用rake 程序的完整路径 RAILS_ENV=production rake assets:precompile :指定 Rails 在执行 rake 任务时加载 production 环境 assets:precompile

【讨论】:

所以rakebin/rake 的行为完全一样?唯一的区别是明确程度? 除非您定义了一个快捷方式rake 来执行其他操作,以启动位于bin/rake 的程序,是的,它们的行为相同。唯一的区别是一个使用快捷方式,而另一个使用完整路径。 如果您能解释在哪里可以找到别名,那就太好了。我在 .bash_profile 和 .bashrc 中都没有。我错过了什么?

以上是关于rake 和 bin/rake 的区别的主要内容,如果未能解决你的问题,请参考以下文章

在 Heroku 上执行 rake db:migrate 时出错

CH2 Hartl 教程迁移正在等待。要解决此问题,请运行: bin/rake db:migrate RAILS_ENV=development

gitlab迁移版本不一致问题

Rake和Ansible有什么区别?

rake db:migrate db:reset 和 db:schema:load 之间的区别

关于 rake 资产的困惑:在 rails 中的资产管道上清理 / 清理