2014-11-06 2 views
3

나는 보석이 어디로 가야하는지 이해하려고 노력하고있다. 나는 보석으로 변환하려고하는 루비 스크립트를 썼다. 내 보석을위한 해골을 만들기 위해 bundler를 사용했습니다.내 보석을 어디에서 개발해야합니까?

이제 2 개의 파일 'Gemfile'과 'mygem.gemspec'이 있습니다.

source 'https://rubygems.org' 

# Specify your gem's dependencies in cudruby.gemspec 
gemspec 

.. 그리고 내 'mygem.gemspec'에서

은 내가 가진 :

# coding: utf-8 
lib = File.expand_path('../lib', __FILE__) 
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) 
require 'mygem/version' 

Gem::Specification.new do |spec| 
    spec.name   = "mygem" 
    spec.version  = Mygem::VERSION 
    spec.authors  = ["mygem"] 
    spec.email   = ["[email protected]"] 
    spec.summary  = %q{mygem} 
    spec.description = %q{mygem} 
    spec.homepage  = "http://www.mygem.com" 
    spec.license  = "MIT" 

    spec.files   = Dir["{lib}/**/*.rb", "bin/*", "LICENSE", "*.md"] 
    spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } 
    spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) 
    spec.require_paths = ["lib"] 

    spec.add_development_dependency "bundler", "~> 1.6" 
    spec.add_development_dependency "rake" 
end 

지금 내 루비 스크립트 3 개 보석에 의존하는 데 사용 내 Gemfile에

나는이 선 말을 가지고 , '팩터', '디버거', 'json'.

어디에서 추가합니까? 그리고 어떻게? 이 http://yehudakatz.com/2010/12/16/clarifying-the-roles-of-the-gemspec-and-gemfile/

이제 사람 (링크에서) 말한다 :

내가이 발견했다. 보석을 개발할 때

", 중복을 피하기 위해 Gemfile에 gemspec 방법을 사용을 일반적으로, 보석의 Gemfile은 젬 소스와 하나의 gemspec 라인을 포함해야 ... "그것이로

그래서 내 gemspec 파일을 왼쪽 ..

전 C https://github.com/puppetlabs/facter/blob/master/Gemfile

.. 그리고 그의 gemspec은 다음과 같습니다 : hecked의 facter의 공식 저장소와 Gemfile은 지금 https://github.com/puppetlabs/facter/blob/master/.gemspec

왜 그는 Gemfile에 자신의 보석이없고, gemspec 아무것도 않습니다? 그는 단지 내가 읽은 것과 정반대로 행동하고 있습니다.

누군가 나를 분명하게 해줄 수 있습니까?

감사합니다.

답변

2

한 가지 중요한 세부 사항 Gemfile 및 mygem.gemspec루비 파일 있다는 것입니다. 즉, 유연성이 뛰어나고 다양한 방법으로 작업 할 수 있습니다. bundlegem에 필요한 데이터가 제공됩니다. 그러나 최근 문서의 표준 예제를 따르는 것이 좋습니다. 코드는 일반적으로 더 명확하고 쉽게 따라 할 수 있습니다.

Gemfile의 방법 gemspec는 "이 프로젝트는 gemspec에 정의 된 보석의 목록을 사용하여"Bundler를 이야기하는 편리한 방법는 - bundle install 수 있도록 허용하는 - 당신이 두 번 종속성을 나열 할 필요 피할 수 즉, 그 의존성을 자동 설치하는 보석.

종속성을 추가 할 위치는 어디입니까? gemspec의 끝에서, 그래서 같은 :

spec.add_development_dependency "rake" 

    # Example of one of your dependencies 
    spec.add_dependency "facter", ">= 2.3.0" 
end 

가 이상적으로 당신이 당신의 보석 무료 버그를 작동 확신 최소 버전을 참조해야합니다.

팩터 보석을 템플릿이나 예제로 사용하면 비표준적인 현상이 발생합니다. 처음에 당신이 연결하는 .gemspec은 이 아니고,의 facter 's gemspec이 보석을 만드는 데 사용되었습니다. 적어도 부분적으로 이것은 거의 10 세인이 보석의 오랜 역사에서 비롯된 것입니다. 처음 작성되었을 때, bundlergem의 툴킷은 현재와 전혀 다릅니다.


이 직접 물었지만, 완성도 주목할 가치가되지 않습니다

종속 리스팅 및합니다 (.gemspec에서) 보석 건물/설치합니다 (Gemfile에) Bundler를위한 것입니다. 코드에 의존성 gem을 자동으로 포함하지 않습니다. 따라서 이전과 마찬가지로 루비 소스에 require 문을 추가해야합니다.

+0

감사합니다. 나는 아직도 약간 혼란 스럽다. 그럼 누군가가 내 보석을 설치한다고 가정 해 봅시다. 'gem install mygem'을 실행하면 gemspec에 모든 보석도 설치됩니다. 사용자가 이미 facter이지만 버전이 다른 경우에는 어떻게해야합니까? 그리고 다시 보석에 사용되는 Gemfile입니까? 언제 누군가가'bundle install '을 사용하여 보석을 설치합니까? U 일반적으로 gemfile에서 intall gems에 번들 설치를 사용합니까? –

+1

'bundle install'은 프로젝트의 일관된 환경을 유지하기위한 것으로, 동시에 모든 버전 요구 사항을 모두 충족 시키려고합니다. 그래서 단순한 개방형 종속성이 가장 좋은 이유입니다. Gemfile은 Bundler에서 사용하기 때문에 보석 개발자는 개발할 수있는 일관성있는 종속성 집합을 가질 수 있습니다. 여기에는 시스템에 설치된 여러 버전의 대처 및 프로젝트에 사용할 버전 선택이 포함됩니다. gemfile이 직접 설치되어 있지 않은 경우, 설치 프로세스는'.gemspec '에 의해 내장 된 데이터를 사용합니다. –