【问题标题】:Command to know Rails project root from shell script从 shell 脚本了解 Rails 项目根目录的命令
【发布时间】:2015-11-08 15:01:26
【问题描述】:

是否有任何明显的命令(可能是 rails 命令、rake 命令或其他命令)可用于从 shell 脚本中获取到 rails 项目根目录的路径?

上下文:

我正在编写一个 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 脚本?
  • @max 感谢您的建议。我从来没有写过 rake 任务,所以没有想到它,但是是的,也许这更适合我。

标签: ruby-on-rails shell rake rails-console


【解决方案1】:

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

【讨论】:

  • 我需要反引号来完成这项工作:rails_root=`rails runner "puts Rails.root"`
【解决方案2】:

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

从 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

一些不错的资源:

【讨论】:

    【解决方案3】:

    不像使用 rake 那样优雅,这是一个依赖于识别 Gemfile 的递归 shell 函数 - 有点像 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
    }
    

    【讨论】:

      猜你喜欢
      • 2020-02-26
      • 2017-05-02
      • 2017-12-10
      • 1970-01-01
      • 2017-07-12
      • 2011-03-13
      • 2013-07-27
      • 2011-06-11
      • 1970-01-01
      相关资源
      最近更新 更多