web-dev-qa-db-ja.com

Rakeファイルを読み込み、他のファイルからタスクを実行する

現在、rakeファイルを分割して整理します。このために、rakeフォルダーにassetsフォルダーを追加しました。このフォルダーには、タスクのグループごとに1つのrakeファイルが保持されています。

私はPHPから来ているので、Ruby/Rakeの非常に基本的な知識しかなく、ロード後に名前空間のデフォルトアクションを実行できませんファイル。

Rake :: Task ...-中の文字列app:init私のCLでエラーをスローします:

rake aborted! 
uninitialized constant TASK

これが名前空間/クラスです(これが正しいWordの場合)。

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
kaiser

目標が外部ファイルからrakeタスクをロードすることである場合は、次のように実行できます。まず、次のような<project>/lib/tasks/hello.rakeというファイルに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を使用します。 Railsアプリケーションで採用されている標準的なアプローチであるため、私はlib/tasksを使用していることに注意してください。assetsまたは好きなものを使用できますが、lib/tasks非Railsプロジェクトでも、名前空間に基づいてタスクファイルを分離する傾向があります。

37
Aaron Massey

タスクをrakelib/フォルダrakeがデフォルトでロードするか、特定のフォルダをRakefileに追加します。

Rake.add_rakelib 'lib/tasks'
50
splattael

@splattaelが言ったように、いつでもRake.add_rakelib 'tasks'を使用できます。知っておくべきことの1つは、「tasks」ディレクトリ内のファイルには「.rb」ではなく「.rake」の拡張子が必要です。そうでない場合、rakeはそれをロードしません。

サンプルファイル:

上記のすべてを実行したら、rake -Tを使用してジョブをチェックし、rakeがタスクを正常にロードしたかどうかを確認します。

5
Xiao Hanyu