8
votes

Portée des râches dans un projet Rails?

J'ai un certain nombre d'analyseurs avec des râteaux dans un projet que je travaille. Lorsque vous utilisez un nom de méthode qui existe déjà dans un autre rake, et parce qu'ils utilisent tous les deux le même environnement, je reçois un conflit.

existe-t-il un moyen de limiter la portée des fichiers Rake dans leur espace de noms? Je pensais que c'était tout le point de l'espace de noms?

Exemple: xxx

Dans ce cas, lors de l'exécution Test de râteau: Test_task Je vais recevoir une erreur d'arguments non valide. D'autre part, si je définis la méthode dans la tâche elle-même, je dois conserver la méthode en haut du fichier Rake dans l'ordre. Cela obtient une sorte de déroutant et moche.

est-ce juste un mal nécessaire?

merci!


0 commentaires

3 Réponses :


10
votes

Je vois les espaces de noms pour les tâches de râteau comme servant le même objectif que les répertoires dans un système de fichiers: ils sont sur l'organisation plutôt que l'encapsulation. C'est pourquoi les tâches de base de données sont dans dB: , les tâches de rails dans rails: , etc.

Les espaces de noms Rake ne sont pas des cours, vous devez donc vous demander quelle classe vous ajoutez test_method à lorsque vous le définissez dans un espace de noms de rake. La réponse est un objet. Donc, lorsque vous avez touché votre deuxième tâche, l'objet a déjà une méthode test_method qui prend un paramètre et Ruby se plaint à juste titre.

La meilleure solution consiste à rendre vos tâches de râteau très minces (juste comme des contrôleurs) et de mettre toutes les méthodes de support (telles que test_method ) dans un fichier de bibliothèque quelque part raisonnable. Une tâche de râteau doit généralement simplement effectuer un peu de configuration, puis appeler une méthode de la bibliothèque pour effectuer le travail réel (c'est-à-dire la même disposition générale en tant que contrôleur).

Résumé exécutif: Mettez tout le travail réel et soulevez lourd quelque part dans vos fichiers de la bibliothèque et apportez vos tâches de ratisser les wrappers minces pour vos bibliothèques. Cela devrait faire disparaître votre problème grâce à une organisation de code appropriée.


2 commentaires

Question de suivi: Stackoverflow.com/questions/6183367/...


Avez-vous eu la chance de jeter un coup d'oeil?



0
votes
module Anonymous
  namespace :test do
    # brabra
  end
end
self.class.send(:remove_const, :Anonymous)

module Anonymous
  namespace :another_test do
    # brabra
  end
end
self.class.send(:remove_const, :Anonymous)
Module.new do end block needs you self:: before any definition. To avoid this, you need to name the module and remove it.

0 commentaires

0
votes

J'ai trouvé un moyen de nommer les méthodes dans les tâches de râteau afin que les méthodes identiques nommées ne soient pas entrées en collision.

  1. Enveloppez chaque espace de noms externe dans un module nommé uniquement. Li>
  2. étendue râteau :: DSL code> li>
  3. Modifiez vos méthodes en méthodes de classe (avec auto. code>). Li> ol>

    J'ai testé cela, et il permet toujours à une tâche de Rake d'invoquer ou de dépendre d'une autre tâche de râteau qui se trouve dans un module différent. P>

    Exemple: P>

    module Test
      extend Rake::DSL
    
      namespace :test do
        task :test_task => :environment do
          ...
        end
    
        def self.test_method(argument)
          ...
        end    
      end
    end
    
    module OtherTest
      extend Rake::DSL
    
      namespace :other_test do
        task :test_task => :environment do
          ...
        end
    
        def self.test_method(argument, argument2)
          ...
        end
      end
    end
    


0 commentaires