2012-07-18 6 views
3

내 질문하나의 Ruby 프로그램을 실행하기 위해 여러 개의 젬 파일에서 보석을 결합하는 방법은 무엇입니까? 가정하자

나는이 같은 디렉토리 구조를 가지고 :

app/ 
    core/ 
     bin/ 
      runner 
     Gemfile 
     ... 
    Gemfile 
    lib/ 

은 "핵심은"자신의 Gemfile 및 Gemfile.lock이있는 응용 프로그램입니다. 나는 어떤 식 으로든 핵심을 수정하고 싶지 않다. app/Gemfile은 코어 플러그인 플러그인의 일부이며 Gemfile (코어/Gemfile에 추가되는 자체 의존성을 나열 함)도 있습니다.

app/core/및 app/directories에서 "번들 설치"를 수행 할 수 있습니다.

app/core/Gemfile 및 app/Gemfile의 모든 Ruby gem을 포함하도록 app/디렉토리에서 core/bin/runner를 실행하려면 어떻게해야합니까?

내가 C 루비를 사용하여, Logstash위한 플러그인을 쓰고 있어요

배경입니다. Logstash에는 자체 Gemfile이 포함되어 있습니다. 일단 모든 의존성을 가져 오면, 총 패키지 크기는 약 40MB입니다.

Heroku에서 Logstash를 실행하고 싶습니다. Git에 40MB의 파일을 저장하는 것을 피하기 위해 Ruby buildpack (https://github.com/inscitiv/heroku-buildpack-logstash)을 포크하고 Logstash를 다운로드하고 압축을 풀고 Gemfile을 사용하도록 수정했습니다.

잘 작동하지만 Logstash에서 제공하는 Gemfile을 사용해야합니다. 내 플러그인의 경우, 내 플러그인이 사용할 새로운 종속성을 추가하려고한다. Logstash를 포크 화하고이를 수행하기 위해 Gemfile을 변경하고 싶지는 않습니다.

대신 Logstash를 자체 디렉토리 (logstash /)에 압축을 풀고 Gemfile for dependencies를 포함하여 내 플러그인 코드를 덮어 쓰려고합니다. 그런 다음 Heroku "worker"프로세스를 실행하여 logstash를 실행하고 "." 플러그인 디렉토리로 사용하고, 두 젬 파일의 모든 젬에 접근 할 수 있습니다.

답변

2

답변은 최상위 Gemfile에 하위 디렉토리 Gemfiles가 포함되어야한다는 것입니다. 이 같은

뭔가 (레드 마인 2.0 Gemfile에서)

# Load plugins' Gemfiles 
Dir.glob File.expand_path("../plugins/*/Gemfile", __FILE__) do |file| 
    puts "Loading #{file} ..." if $DEBUG # `ruby -d` or `bundle -v` 
    instance_eval File.read(file) 
end 
1

번들러가 모든 보석 의존성을 올바르게 얻으려면 제대로 작동하려면 하나의 파일에 모두 포함시켜야합니다. 플러그인을 보석으로 만들고 배포 루틴에서 상위 Gemfile에 하나의 보석을 추가 할 수 있습니까? 그러면 자신의 보석에 전체에 통합 될 종속성을 나열 할 수 있습니다.

+1

하나의 문제는 Heroku가 존재 최신이하는 Gemfile.lock이 필요하다는 것이다. 따라서 Logstash를 포크하고 Gemfile과 Gemfile.lock을 업데이트해야합니다. 나는 그것을 피하려고 노력하고있다. – kgilpin

+1

Bundler와 Gemfiles의 전체적인 지점입니다. 소스 제어에 들어가기 전에 개발 시간에 의존성 트리를 함께 잠급니다. 그런 다음 배포시 정확히 동일한 환경을 설치합니다. 이를 수행하는 유일한 방법은 최상위 레벨 Gemfile.lock이 모든 종속성을 미리 나열해야 함을 의미합니다. 비행 중에 새로운 문을 비행기에 설치하려고하는 것처럼 나에게 들립니다. – DGM