2012-01-27 1 views
2

제목이 질문이며, 여기에 질문하는 문맥이 있습니다.번들 : 왜 "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를 사용하여 보석의 종속성을 관리하기로 결정했습니다. 번들러를 통해 보석 라이브러리를 요구할 때 분명히 gemspec도 실행됩니다. 나는 충분히 쉽게 "고칠 수있다. 나는 gemspec에서 손으로 버전 번호를 정의한다.

그래서 내 질문으로 돌아가서 - 번들러는 왜 도서관의 런타임에서 보석을 조사해야합니까?

들러 (1.0.21)

어떤 통찰력을 많이 받고있다.

답변

3

번들러를 실행할 때마다 Gemfile을 구문 분석하여 어떤 보석을로드해야하는지, $LOAD_PATH에 추가해야하는지 등을 실제로 파악해야합니다. 그 일환으로, gemspec을 구문 분석해야합니다.

Gemfile.lock에는 시작 시간을 절약하기 위해 모든 젬과 종속성에 대한 정보가 들어 있지만 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/ (당신이 대답 한 후에) 그리고 그것은 또한 whys와 wherefors를 설명한다. 그러나 나는 생각한다. "Gemfile에는 메타 데이터, 패키지에있는 파일 목록, 패키지에 의해 노출 된 실행 파일 또는로드 경로에 놓여 야하는 디렉토리가 들어 있지 않습니다. 이러한 것들은 Bundler의 범위 밖에 있습니다." 그건 내 경험이 아니에요. 특히''bundler/setup ''과 같은 명령어를 주면됩니다.답변과 팁에 다시 한 번 감사드립니다. – iain

관련 문제