从 shell 脚本了解 Rails 项目根目录的命令

Command to know Rails project root from shell script

是否有任何明显的命令(无论是 rails 命令、rake 命令还是其他命令)我可以使用它从 rails 项目的根目录中获取路径 shell 脚本?

上下文:

我正在编写 shell 脚本。我将从 rails 项目内的任意目录执行该脚本,脚本需要确定 rails 项目根目录的绝对路径。

因此,例如,如果脚本是

#!/bin/bash
rails_root=# get the root somehow...

假设我项目的根目录是

/home/myuser/projects/myrailsapp

那么我应该可以将该脚本放入

/home/myuser/projects/myrailsapp/scripts/myscript

并从项目的其他地方调用它

cd /home/myuser/projects/myrailsapp/app/assets
../../scripts/myscript

而且脚本应该可以知道根目录的路径

我想出了两种不同的方法来解决这个问题:

#!/bin/bash
rails_root=$(rake about | grep 'Application root' | sed 's/Application root[ ]*//')
#!/bin/bash
rails_root=$(rails c <<-EORUBY | grep ^rails_root_is | sed 's/rails_root_is//' 
  puts "rails_root_is#{Rails.root}" 
EORUBY
)

但我觉得应该有更明显的方法来做到这一点。我期待使用现有的命令。

您可以使用 rake 而不是 shell 脚本。除了处理高级语言的简单性之外,您还可以完全访问 rails 环境,并且在处理应该工作的 shell 脚本时不必处理所有的陷阱和问题平台和 shells.

从 rails 生成 rake 任务:

rails g task foo dosomething

这将在 lib/tasks/foo.rake 中生成一个 rakefile。从 rake 任务中,您可以通过 Rails.root.

访问 Rails 根目录
namespace :foo do
  desc "TODO"
  task dosomething: :environment do
    puts "Rails root is: #{ Rails.root }"
    puts "Current working directory is: #{ Dir.pwd }"
    # You can invoke the shell with backticks, exec or ...
    puts "You are: " + `whoami`
  end
end

几个不错的资源:

不像使用 rake 那样优雅,这是一个递归 shell 函数,它依赖于识别 Gemfile - 有点 hack 但非常快。还有其他几种方法可以确定您是否找到了 Rails 根。

function rr () {
    if test `pwd` = $HOME
    then
        echo not in Rails
    elif test -f Gemfile && grep Rails Gemfile > /dev/null
    then
        pwd
    else
        (cd ..; rr)
    fi
}

如果您真的需要它在 shell 中,您可以: rails_root=rails runner -e development "puts Rails.root"|tail -1