2012-01-27 68 views
2

標題是問題,這裏是提示它的上下文。Bundler:爲什麼它要求「bundler/setup」讀取gemspec?

的Gemfile中:

source "http://rubygems.org" 

# Specify your gem's dependencies in the gemspec 
gemspec 

這裏是rackup文件的頂部:

require 'rubygems' 
require "bundler/setup" 

在運行rackup文件中的錯誤被拋出:

<module:Rack>': GemName is not a class (TypeError) 

爲什麼?因爲我寫了一塊機架中間件,標準佈局是:

lib/ 
    rack/ 
    gem_name.rb 
    gem_name/ 
     version.rb 

gem_name.rb將包含:

module Rack 
    class GemName 

version.rb將包含:

module Rack 
    module GemName 
    VERSION = "0.0.1" 

最後,gem_name.gemspec將包含:

require "rack/flash-in-the-pan/version" 
#... 
s.version  = Rack::GemName::VERSION 

只要不需要兩個文件同時命名模塊和同名的類別不是問題通常,這不會發生,因爲您需要用於構建寶石的版本,或者您需要運行寶石庫,只需要一個或其他獲取。

但是,這次我決定使用Bundler來管理gem的依賴關係。當通過捆綁器需要寶石庫時,它顯然也會運行gemspec。我可以很容易地「修復」它,我在gemspec中手工定義版本號。

所以回到我的問題 - 爲什麼Bundler需要在庫的運行時查看gemspec?

打包商(1.0.21)

任何有識之士都非常感謝。

回答

3

無論何時運行捆綁器,它都必須解析Gemfile才能真正找出需要加載哪些寶石,必須將哪些寶石添加到$LOAD_PATH等等。作爲其中的一部分,它必須解析gemspec

Gemfile.lock包含有關所有gem的信息以及用於節省啓動時間的依賴關係,但並不能減輕它解析Gemfile的需要。

有多種方法可以解決它。兩個簡單的將使用File.read和一些正則表達式來拉出版本。或者需要gem_name.rb和gem_name/version.rb文件。

+0

感謝您的回覆。我發現這個http://yehudakatz.com/2010/12/16/clarifying-the-roles-of-the-gemspec-and-gemfile/(在你回答之後),它也解釋了什麼和什麼地方,但我認爲「Gemfile不包含元數據,軟件包中的文件列表,軟件包公開的可執行文件或者應該放在加載路徑上的目錄,這是一個奇怪的參數,這些超出了bundler的範圍」。這不是我的經驗,特別是如果你有一個命令,如「require」bundler/setup「'。再次感謝回覆和提示。 – iain 2012-02-08 20:43:14

相關問題