2015-08-15 112 views
1

是否有任何明顯的命令(無論是rails命令,rake命令還是其他)可用於從shell腳本中獲取rails項目根目錄的路徑?從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 
) 

但我覺得應該有這樣做更明顯的方式。我期待使用現有的命令。

+0

你爲什麼不創建一個rake任務,而不是一個shell腳本? – max

+0

@max感謝您的建議。我從來沒有寫過一個耙子任務,所以它沒有想到,但是,是的,也許這會更適合我。 – abl

回答

1

您可以使用rake代替shell腳本。除了處理高級語言的簡單性外,您還可以完全訪問rails環境,並且在處理跨平臺和shell的shell腳本時,您不必處理所有陷阱和問題。

爲了從軌rake任務:

rails g task foo dosomething 

這將在lib/tasks/foo.rake產生一個Rake文件。從rake任務中,您可以訪問Rails根目錄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 

幾個不錯的資源:

0

不一樣優雅的使用耙子,這是一個遞歸shell函數依賴於確定的Gemfile - 種的黑客,但相當快。還有其他幾種方法可以確定您是否找到了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 
} 
1

如果你真的需要它是一個外殼,你可以: RAILS_ROOT = rails runner -e development "puts Rails.root"|tail -1

+0

我需要反斜槓來完成這項工作:'rails_root = \'rails runner「放置Rails.root」\'' – KenB