Je veux mes projets haut niveau Rakefile pour construire des choses en utilisant des râpesfiles plus profondément dans l'arbre; C'est-à-dire le haut niveau RakeFile dit comment construire le projet (image de grande taille) et le niveau inférieur à la construction d'un module spécifique (photo locale). P>
Il existe bien sûr un ensemble partagé de configuration pour la minute de détails de le faire chaque fois que cela peut être partagé entre les tâches: il s'agit donc principalement de garder les descriptions de ce qui nécessite la construction de sources. Par exemple. /Source/module/code.foo et Cie doit être construit à l'aide des instructions dans / Source / Module / Ramefile; et / rakefile comprend les dépendances entre les modules. P>
Je m'en fiche s'il utilise plusieurs processus de râteau (maquillage ala récursif) ou crée simplement des environnements de construction distincts. De toute façon, il devrait être suffisamment contentable pour être traité par une file d'attente: de sorte que les modules non dépendants puissent être construits simultanément. P>
Le problème est, comment diable faites-vous réellement quelque chose comme ça avec Rake !? Je n'ai pas été en mesure de trouver quelque chose de significatif sur Internet, ni dans la documentation. J'ai essayé de créer un nouveau Rake :: Objet d'application et de la configuration, mais quoi que ce soit Méthodes A > J'essaie d'invoquer, seulement des exceptions ou "Je ne sais pas comment créer la tâche ': les erreurs" "par défaut sont lancées. (Oui, tous les rakeFiles ont un: défaut). Évidemment, on pourrait simplement exécuter «Rake» dans un sous-répertoire pour une tâche: Modulename, mais cela abandonnerait les options données au niveau supérieur; par exemple. Pensez à $ (make) et $ (MakeFlags). P>
Quelqu'un a un indice sur la manière de faire correctement quelque chose comme un récursif code> rake? p>
4 Réponses :
Vous pouvez Mettez ceci dans rakefile.rb: p> exiger code> Rake Files à partir d'autres fichiers Rake et exécutez les tâches à partir du fichier requis.
task :bar do
puts "baz"
end
Si j'ai bien compris votre problème, c'est que vous devez appeler une tâche de râteau dans une autre tâche de râteau à partir d'une autre tâche de râteau différente.
Vous pouvez avoir construit vos tâches nécessaires dans / Source / Module / RakeFile comme vous en avez besoin et faites une autre râteaufile dans / rakefile et exécuter des tâches de cette façon. p> -f strong> permet de définir où se trouve le microfilmile "/ p> Vous pouvez également spécifier où se trouve votre dossier Rakelib avec -R. P> rake -f /path/to/Rakefile -R /path/to/rakelib foo:bar
L'inconvénient de Rake -f est qu'il ne définit pas le répertoire de travail à l'emplacement du fichier de rake invoqué.
J'ai aussi une exigence similaire et j'ai créé la fonction suivante
rakeutils.rb: p> et dans les ratisserfiles, où que je veux avoir cette fonctionnalité, je viens de Incluez-le ... pour par exemple p> RakeFile: P> require 'rakeutils'
task :test1 do
puts "Hi"
end
task :default => :test1
subdirs ["ab", "cd"]
BTW, le code ci-dessus a une autre limitation qu'il ne peut pas fonctionner de manière récursive à sec lorsque "-N ou - Soi-point" est fourni. Si vous voulez vraiment une course à sec reconsivement avec des options de passage sur rake récursives, voir mon autre réponse
Comme mentionné dans mon poste précédent, voici l'extrait de code qui prend en charge presque comme un comportement récursif de râteau, y compris les options de passage, de la course à sec, de la trace, de la tâche de niveau supérieur.
RAKE: P>
#!/usr/bin/env ruby begin require 'rubygems' gem 'rake' rescue LoadError end $sub_directories = [] $top_level_task_provided__skip_subdir = 0 module Rake REDUCE_COMPAT = true if ARGV.include?("--reduce-compat") RAKE_OPTS = ARGV.clone.join(" ") module DSL def subdirs dirs puts "DIRS: #{dirs}" $sub_directories = dirs end end end require 'rake' Rake.application.standard_exception_handling do Rake.application.init $top_level_task_provided__skip_subdir = 1 if Rake.application.top_level_tasks.size >= 1 and Rake.application.top_level_tasks[0] != "default" Rake.application.load_rakefile if Rake.application.tasks.size == 0 and $sub_directories.size != 0 then desc "Default task when only subdirs is present in a rakefile" task :default do puts "Default subdir task" end end Rake.application.top_level end if $top_level_task_provided__skip_subdir == 0 then $sub_directories.each do |d| unless rake_system("cd #{d} && pwd && ruby #{File.expand_path $0} #{Rake::RAKE_OPTS}") then exit(1) end end end
Veuillez noter que ce script est uniquement testé avec Ruby2.0 et Rake 0.9.6. Tout changement dans les internes "Rake", peut casser le code ci-dessus