比如 1: 先设置环境:
RAILS_ENV=staging rails c
2: 后设置
rails c RAILS_ENV=staging
第 2 种报错,第一种 ok。 看到 unicorn 执行 rake 也是这样如是写到
run "cd #{deploy_to}/current; /usr/bin/env bundle exec rake RAILS_ENV=#{rails_env} #{ENV['task']}"
他们两者地区别是?
写在前面是环境变量。如果对于非 rails、rake 命令,写在后边,就不能当作环境变量读取。
在 https://github.com/rails/rails/blob/master/railties/lib/rails/commands/commands_tasks.rb#L5 这里提到某些命令需要参数前置,而 https://github.com/rails/rails/blob/master/railties/lib/rails/commands/commands_tasks.rb#L62 明确表示 console 命令需要在运行之前加载 config/application,参数必需要写在前面。
也就是说运行 rails c 时,首先启动的就是 rails app,而 rails app 需要 RAILS_ENV,所以只能前置。
而后置的是 rake 的写法,运行顺序应该是 rake -> rails app,也就是说 RAILS_ENV 这个变量其实是传递给 rake 再转交到 rails 的。
以上仅供参考,不知道对不对。
理解错误,看4楼
#2 楼 @saiga 原来看源码是一种不错地解决问题方法。。 btw: rails4 可以使用 rails c -e xxx, but rails3 不行, 原来 rails4 才加上的: https://github.com/rails/rails/blob/4-0-stable/railties/lib/rails/commands/console.rb#L18 https://github.com/rails/rails/blob/3-2-stable/railties/lib/rails/commands/console.rb#L20
楼上说的都不对噢~
RAILS_ENV needs to be set before config/application is required
这里的 before 不是参数必须写在前面的意思。
写在前面是 ENV , 写在后面是 ARGV.
rake 写在后面,但是用法和 ENV 一样的原因在这里
def collect_command_line_tasks @top_level_tasks = [] ARGV.each do |arg| if arg =~ /^(\w+)=(.*)$/m ENV[$1] = $2 else @top_level_tasks << arg unless arg =~ /^-/ end end @top_level_tasks.push(default_task_name) if @top_level_tasks.empty? end
#4 楼 @zgm 受教了