web-dev-qa-db-fra.com

Charger des fichiers de râteau et exécuter des tâches à partir d'autres fichiers

Actuellement, j'essaie de diviser mes fichiers de râteau pour mieux les organiser. Pour cela, j'ai ajouté un dossier rake à mon répertoire assets, qui contient un fichier rake pour chaque groupe de tâches.

Comme je viens de PHP, je n'ai que des connaissances très basiques de Ruby/Rake et je ne peux pas exécuter l'action par défaut de mes espaces de noms après le chargement du fichier.

La chaîne Rake :: Task ... Mise en commentaire à l'intérieur de app:init Me renvoie une erreur au CL:

rake aborted! 
uninitialized constant TASK

Voici l'espace de noms/classe (si c'est le bon mot).

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

Merci d'avance.

Edit: Au moins, je peux être sûr que le fichier est chargé, car le simple puts "file loaded" Au début de ces fichiers est répété. Le problème semble uniquement être que l'action :default Pour l'espace de noms dans le fichier râteau chargé ne se charge pas.

31
kaiser

Si votre objectif est de charger des tâches de râteau à partir d'un fichier externe, vous pouvez le faire comme suit. Tout d'abord, supposons que vous ayez une tâche de râteau dans un fichier appelé <project>/lib/tasks/hello.rake qui ressemble à ceci:

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

Ensuite, vous pouvez créer un simple Rakefile dans votre <project> répertoire pour le charger comme ceci:

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

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

Bien sûr, cela chargera tous les fichiers se terminant par l'extension rake. Vous pouvez simplement charger hello.rake comme ça:

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

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

Pour voir toutes les tâches qui ont été chargées, utilisez rake -T. Notez que j'ai utilisé lib/tasks puisque c'est l'approche standard adoptée par Rails applications. Vous pouvez utiliser assets ou ce que vous préférez, bien que je préfère lib/tasks même dans les projets non-Rails. J'ai également tendance à séparer mes fichiers de tâches en fonction de leur espace de noms.

37
Aaron Massey

Vous pouvez soit mettre vos tâches dans rakelib/ dossier que rake charge par défaut ou ajoutez un dossier spécifique dans votre Rakefile via:

Rake.add_rakelib 'lib/tasks'
50
splattael

Vous pouvez toujours utiliser Rake.add_rakelib 'tasks', comme l'a dit @splattael. Une chose que vous devez savoir, les fichiers dans le répertoire "tâches" doivent avoir une extension ".rake" au lieu de ".rb", sinon, rake ne le chargera pas pour vous.

Exemple de fichier:

Après avoir fait tout ce qui précède, utilisez rake -T pour vérifier votre travail pour voir si le râteau a réussi à charger vos tâches.

5
Xiao Hanyu