2012-12-07 65 views
25

目前我試圖拆分我的耙文件以更好地組織它們。爲此,我在assets目錄中添加了一個rake文件夾,該文件夾爲每組任務保存一個rake文件。加載耙文件並從其他文件運行任務

由於我來自PHP,我只有非常基本的瞭解Ruby/Rake,並且無法在加載文件後運行我的命名空間默認操作。

的commmented了Rake :: Task ...app:init -string拋出該CL的錯誤我:

rake aborted! 
uninitialized constant TASK 

這裏的命名空間/班(如果這是正確的字)。

task :default => [ 'app:init' ] 
namespace :app do 

    rake_dir = "#{Dir.pwd}/assets/rake/" 
    rake_files = FileList.new("#{rake_dir}*") 

    desc "Loads rake modules (Default action)" 
    task :init do 
     puts "\t Importing rake files for processing" 

     puts "\t loading..." 
     rake_files.each() { |rake| 
      puts "\t #{rake}" 
      require rake 
      # @link rubular.com 
      name = rake.split(rake_dir).last.gsub(/.rb\z/, '') 
      puts "\t #{name}" 
      #Rake :: Task[ "#{name}:default" ].invoke 
     } 
    end 
end 

在此先感謝。

編輯:至少,我可以確定該文件被加載,因爲在這些文件的開頭簡單puts "file loaded"得到迴應。問題似乎只有:default加載的rake文件中的名稱空間的操作未加載。

回答

31

如果你的目標是從外部文件加載rake任務,那麼你可以這樣做,如下所示。首先,讓我們假設你有一個文件rake任務叫做<project>/lib/tasks/hello.rake,看起來像這樣:

desc "Say hello" 
task :hello do 
    puts "Hello World!" 
end 

然後你就可以創建一個在您<project>目錄簡單Rakefile加載這樣的:

Dir.glob('lib/tasks/*.rake').each { |r| load r} 

desc "Say goodbye" 
task :goodbye do 
    puts "See you later!" 
end 

當然,這將加載以rake擴展名結尾的所有文件。你可以簡單地加載hello.rake這樣的:

load './lib/tasks/hello.rake' 

desc "Say goodbye" 
task :goodbye do 
    puts "See you later!" 
end 

要查看所有已加載使用rake -T的任務。請注意,我使用lib/tasks,因爲這是Rails應用程序採用的標準方法。您可以使用assets或任何您喜歡的,但我更喜歡lib/tasks即使在非Rails項目中。我也傾向於根據他們的命名空間來分離我的任務文件。

33

你可以把你的任務分爲rakelib/文件夾其中rake將默認加載或在您的Rakefile通過添加特定的文件夾:

Rake.add_rakelib 'lib/tasks' 
+1

從來不知道這一點。謝謝! – Andrew

+2

一個改進:你可以提到單個文件可以很容易地使用'load'file.rb「'加載。那麼這應該是被接受的答案。 – Overbryd

+0

這個答案應該受到保護。我從來不知道這個'rakelib /'目錄 – Pred

相關問題