6
votes

Comment faire un râteau récursif? - ou des alternatives appropriées

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).

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.

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.

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 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).

Quelqu'un a un indice sur la manière de faire correctement quelque chose comme un récursif rake?


0 commentaires

4 Réponses :


3
votes

Vous pouvez exiger code> Rake Files à partir d'autres fichiers Rake et exécutez les tâches à partir du fichier requis.

Mettez ceci dans rakefile.rb: p>

task :bar do
  puts "baz"
end


0 commentaires

0
votes

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> xxx pré>

-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


1 commentaires

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é.



0
votes

J'ai aussi une exigence similaire et j'ai créé la fonction suivante

rakeutils.rb: p> xxx pré>

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"]


1 commentaires

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



2
votes

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


1 commentaires

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