从 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
是否有任何明显的命令(无论是 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
.
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