2010-04-07 75 views
0

我真的不明白的一件事是我如何將自定義啓動選項傳遞給mongrel實例。將自定義信息傳遞給mongrel_rails開始

我看到一種常見的方法是使用環境變量,但在我的環境中,這是行不通的,因爲我的rails應用程序服務於許多不同的客戶端。許多代碼是在客戶端之間共享的,但也有很多不同之處,我通過繼承控制器和視圖來實現重載或擴展現有功能或引入新功能。爲了實現這一切,我只需將路徑添加到客戶端特定模塊的模塊加載路徑($ :)。

爲了啓動特定客戶端的應用程序,我現在可以使用像say,TARGET = AMAZONE這樣的環境變量。不幸的是,在一些系統上,我運行多個混合羣集,每個羣集都服務於不同的客戶端。其中一些系統在Windows下運行,並啓動mongrel,我安裝了mongrel_services。顯然,這使得我的環境變量不合適。

將這些額外的數據傳遞給應用程序被證明是一個真正的挑戰。首先,mongrel_rails service_install將拒絕沒有記錄的任何[自定義]命令行參數。我並不擔心安裝使用安裝程序的服務是微不足道的。

但是,即使我設法安裝mongrel_services,以便在運行時將自定義命令行選項--target傳遞給mongrel_rails start,但由於mongrel_rails無法識別交換機,所以出現錯誤。

所以這裏是我看着東西:

  1. 傳遞一個額外的參數:

    mongrel_rails開始--target XYZ ...

  2. 使用一個配置文件,並添加目標:XYZ,然後執行:

    mongrel_rails start -C x:\ myapp \ myconfig.yml

  3. 修改文件:

    紅寶石\ LIB \紅寶石\寶石\ 1.8 \寶石\雜種-1.1.5-x86的mswin32-60 \ LIB \雜種\ command.rb

  4. 也許我可以用 - 腳本選項,但我發現它的所有文檔是Unix的

1和2根本不工作。我玩了4次,但從未設法做任何事情。所以我別無選擇,只能用3.雖然它比較簡單,但我討厭更改ruby庫代碼。

特別令人失望的是2不起作用。我的意思是在配置文件中添加其他[自定義]選項是非常不合理的。其實我認爲這是一個在軌道上缺少的基本部分。不知何故,應用程序應該能夠註冊並訪問它期望的命令行參數。

如果有人有一個好主意如何使用當前的基礎設施更優雅地做到這一點,我有一個巧克力魚放棄!

回答

0

可能沒有必要把東西傳給雜種。使用現有機制可能會提供您尋求的靈活性。我們首先試着清楚約束條件。

換句話說,似乎下列條件是有效的。

  • 相同的代碼基礎(或非常相似的基本代碼)被用來服務於多個客戶
  • 標識符影響,需要在應用程序啓動(或執行之前)來定義應用程序的行爲
  • 多組應用程序執行的雜種集羣可以在單個系統上具有專用於單個客戶端的每個羣集中使用
    • 這意味着的處理羣集中的所有服務相同的代碼庫具有相同配置的值(一個或多個)
  • 有些客戶希望在Windows服務器上運行,這樣可以避免使用某些Unix樣式的環境和腳本行爲。

應該驗證的一個假設是每個代碼庫位於一個單獨的目錄中。如果是這樣,那麼可能會有一個非常簡單的解決方案。

如果每個客戶在自己的目錄,比如:

/src 
    /customer1 
    /customer2 
    /customer3 

如果你喜歡的東西開始你的雜種流程:

[/src/customer1]$ mongrel_rails cluster::start 

然後,你可以有一個customer_config.yml文件在系統啓動時(在您的environment.rb中)讀取,您可以在其中放置客戶端自定義值。所以,如果你需要在「女將」通過爲目標值,那麼你的YAML文件可能看起來像:

target: 
    Amazone 

然後,每個客戶得到自己customer_config.yml文件,該文件只存在於自己的目錄,並且在添加新客戶時只有一個文件需要更改以切換行爲。

修改你的environment.rb來尋找一個特別命名的YAML文件是完全可以接受的。解析YAML文件相當容易,並且它爲管理每個客戶的定製提供了很大的靈活性。

+0

除了「每個客戶都在自己的目錄中」之外,您的所有假設都是正確的。 我們的結構看起來更像: 根/應用/控制器/富 根/應用/控制器/富/ AMAZONE 根/應用/控制器/富/尼羅河 根/應用/控制器/富/金剛 根/應用程序/視圖/富 根/應用/視圖/富/ AMAZONE 根/應用/視圖/富/尼羅河 根/應用/視圖/富/金剛 根/配置 根/配置/ AMAZONE 根/配置/ Nile root/config/Kongo root/log root/log/Amazone root/log/Nile root/log/Kongo 等 客戶特定的文件夾(即Amazone,Nile,Kongo)僅在客戶需要自定義特定行爲時才存在。 – whaka 2010-04-08 22:07:25

+0

重要的是,如果您開始說尼羅河的rails應用程序,那麼Amazone或Kongo中的任何文件都不具有任何相關性,並且如果您在路徑中刪除了Amazone或Kongo的任何文件夾,系統對尼羅河都將起到相同的作用。顯然,我們需要傳遞給啓動代碼的東西,以便確定要激活哪個實現。如果這是通過YAML文件(例如-C開關),自定義命令行開關或--script參數的內容發生的,我無所謂。 – whaka 2010-04-08 22:16:35

+0

感謝您的澄清。這個解決方案可能會延伸Rails約定;我發現,當ROR很難時,通常意味着我偏離了慣例。交通如何導向應用程序?訪問Amazone網站的訪問者如何到達那裏而不是Kongo或Nile網站? – 2010-04-09 12:22:01