2011-05-30 79 views
7

我有一些解析器,我在使用耙子運行的項目中運行。當使用另一個rake中已經存在的方法名稱,並且由於它們都使用相同的環境時,我會遇到衝突。圍欄項目的圍欄範圍?

有沒有辦法限制其名稱空間內的rake文件的範圍?我認爲這是命名空間的全部重點?

例子:

namespace :test do 
    task :test_task => :environment do 
     ... 
    end 

    def test_method(argument) 
    ... 
    end  
end 

namespace :other_test do 
    task :test_task => :environment do 
    ... 
    end 

    def test_method(argument, argument2) 
    ... 
    end 
end 

在這種情況下,運行rake test:test_task當我接收參數錯誤的無效的金額。另一方面,如果我在任務本身內定義方法,則必須按照順序將方法保留在rake文件的頂部。這會讓人感到困惑和醜陋。

這只是一個必要的邪惡?

謝謝!

回答

8

我看到rake任務的命名空間與文件系統中的目錄具有相同的用途:它們關於組織而不是封裝。這就是爲什麼數據庫任務是db:,Rails的在rails:任務等。所以你要問自己,你要添加test_method當你瑞克命名空間中定義它是什麼類

耙命名空間是不是類。答案是Object。所以,當你第二次執行任務時,Object已經有一個方法需要一個參數,Ruby正確地投訴。

最好的解決方案是讓你的Rake任務非常簡單(就像控制器一樣),並將某些支持方法(如test_method)關閉在某個合理的庫文件中。 Rake任務通常只需要做一些設置,然後調用一個庫方法來完成真正的工作(即與控制器相同的總體佈局)。

執行摘要:將所有實際工作和繁重工作放在庫文件的某處,並使您的Rake任務爲您的庫提供精簡的包裝。這應該通過正確的代碼組織讓您的問題消失。

+0

跟進的問題:HTTP://計算器。com/questions/6183367/dynamic-namespace-rakes-and-parser-classes-with-rails – 2011-05-31 06:28:26

+0

你有機會看看嗎? – 2011-06-02 21:45:52

0
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塊需要你self::之前的任何定義。爲了避免這種情況,您需要命名模塊並將其刪除。

0

我已經想出了一種在Rake任務中命名空間方法的方法,所以相同名字的方法不會發生衝突。

  1. 將每個外部名稱空間包裹在一個唯一命名的模塊中。
  2. extend Rake::DSL
  3. 將您的方法更改爲類方法(使用self.)。

我測試過了,它仍然允許一個rake任務調用或依賴另一個模塊中的另一個rake任務。

例子:

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