2012-12-07 3 views
25

Actuellement, j'essaie de scinder mes fichiers de rake pour mieux les organiser. Pour cela, j'ai ajouté un dossier rake à mon dossier assets, qui contient un fichier râteau pour chaque groupe de tâches.Charger des fichiers de rake et exécuter des tâches à partir d'autres fichiers

Comme je viens de PHP, je n'ai que très basique connaissance de Ruby/Rake et ne peut pas obtenir l'action par défaut de mes espaces de noms en cours d'exécution après le chargement du fichier.

Le commmented sur Rake :: Task ... -string l'intérieur app:init renvoie une erreur au CL me:

rake aborted! 
uninitialized constant TASK 

est ici l'espace de noms/classe (si tel est le mot juste).

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é, comme puts "file loaded" plaine au début de ces fichiers se fait l'écho. Le problème semble seulement être que l'action :default pour l'espace de noms dans le fichier Rake chargé ne charge pas.

Répondre

31

Si votre objectif est de charger des tâches râteau à partir d'un fichier externe, vous pouvez le faire comme suit. Tout d'abord, disons que vous avez 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 Rakefile simple dans votre répertoire <project> 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 va charger tous les fichiers se terminant par l'extension rake. Vous pouvez simplement charger hello.rake comme ceci:

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és rake -T utilisation. Notez que j'ai utilisé lib/tasks puisque c'est l'approche standard adoptée par les applications Rails. Vous pouvez utiliser assets ou ce que vous préférez, bien que je préfère lib/tasks même dans des projets non-Rails. J'ai également tendance à séparer mes fichiers de tâches en fonction de leur espace de noms.

33

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

Rake.add_rakelib 'lib/tasks' 
+1

Je ne savais pas à ce sujet. Merci! – Andrew

+2

Une amélioration: Vous pouvez mentionner que les fichiers individuels peuvent facilement être chargés en utilisant 'load 'file.rb" '. Alors cela devrait être la réponse acceptée. – Overbryd

+0

Cette réponse devrait être protégée. Je n'ai jamais entendu parler de ce répertoire 'rakelib /' – Pred

2

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

Exemple de fichier:

Une fois que vous faites tous les ci-dessus, utilisez rake -T pour vérifier votre travail pour voir si rake a charge avec succès vos tâches.

+0

Great info. Merci! – kaiser

Questions connexes