2013-03-19 58 views
2

tl; dr

我正試圖作爲一個可安裝的引擎分離出一個更大的應用程序的一部分。發動機將以不同的口味存在,每個都包含在他們自己的寶石中。我無法讓寶石名稱與引擎常量名稱不同。做寶石規格。名稱必須等於寶石常數名稱?

詳細

所提取的部分包含用於註冊,認證和會話處理邏輯。該應用程序由全球不同地區的客戶使用,針對使用該產品的最終客戶提出不同的要求和規定。這促使我們爲每個監管區域的這些需求創建單獨的模塊。他們目前生活在lib目錄中,並且根據配置加載不同的實現。

與發動機的目標是,你安裝適當的引擎和文件航線航線所有有關調用引擎。

因爲我們有幾個這樣的登記模塊,並且更多的驚喜,我們需要保持的變種幾個寶石。我試圖讓這些寶石具有不同的名稱(auth_A,auth_B等),但是包含的引擎具有相同的名稱Auth :: Engine。

這樣,我們就可以包括在Gemfile中,其餘正確的創業板將只是工作,因爲它應該擊潰到端點總是相同的,無論是運行的是什麼版本的。

問題

我運行的問題是,我不能縫拿到寶石有一個名字和發動機恆定的另一...

如果我生成一個新的引擎名稱AUTH它可以很好地將它安裝在主應用程序中。如果我然後更改gem名稱和包含文件夾auth_a並更新主機應用程序Gemfile它停止工作,我可以捆綁很好,但是當我嘗試啓動主機應用程序失敗時,它掛起引擎,抱怨Auth ::引擎是一個未定義的常量。

我,微微刪節,gemspec看起來是這樣的:

$:.push File.expand_path("../lib", __FILE__) 

# Maintain your gem's version: 
require "auth/version" 

# Describe your gem and declare its dependencies: 
Gem::Specification.new do |s| 
    s.name  = "auth_a" 
    s.version  = Auth::VERSION 
    s.authors  = ["Jonas Schubert Erlandsson"] 
    s.email  = ["[email protected]"] 
    s.homepage = "http://some.page.on/the/internet.html" 
    s.summary  = "Authentication module for A" 
    s.description = "This engine, when mounted in Host app, handles registration, account update, login and logout of users." 

    s.files = Dir["{app,config,db,lib}/**/*"] + ["MIT-LICENSE", "Rakefile", "README.rdoc"] 
    s.test_files = Dir["test/**/*"] 

    s.add_dependency "rails", "~> 3.2.13" 
end 

我從生成腳手架唯一改變的是s.name = "auth_a"。來自主機應用程序的相關行Gemfile:gem 'auth_a', path: "../auth_a" ...

我已經瀏覽了整個源代碼樹,試圖找到它從gem名稱中推斷出一個名稱,但我看不到它。我不知道我錯過了什麼,並且寶石規格文檔對此也沒有多大的幫助......我不認爲寶石名稱是綁定到寶石的常量名稱,但也許我是錯誤?你可以重寫它嗎?還是我錯過了別的?

回答

4

這個問題的答案是簡單地將此添加到主機中的線路應用程式的Gemfile:gem 'auth_a', path: "../auth_a", require: 'auth'

所以它看起來像它默認爲要求,即自動加載的基礎上,寶石名稱恆定的,而是需要調用告訴它需要什麼來代替。

希望它可以幫助別人以及:)