2011-01-02 4 views
2

사용자가 제공 한 루비 코드를로드하는 프레임 워크를 구축 중입니다. 이것은 기본적으로 플러그인 메커니즘입니다. 나는 사용자가 자신의 보석을 요구할 수있는 루비 코드를 제공하기를 원한다. 나는 "plugin"패키지에 보석과 함께 공급 업체 디렉토리를 포함시킬 계획이다.ruby ​​gem의 충돌 버전 관리하기

플러그인이 프레임 워크의 보석과 충돌하지 않고 필 요한 보석을로드하려면 어떻게해야합니까? 예를 들어, 내 프레임 워크가 treetop 버전 1.3.0을 사용하고 플러그인이 treetop 1.4.2를 사용한다면 각각이 지정된 버전으로 작업하기를 원합니다.

마찬가지로 플러그인이 서로 충돌하는 것을 방지 할 수있는 방법이 있습니까?

gem_plugin, _why 's sandbox 및 기타 도구를 살펴 보았습니다. 그러나 나는이 사건을 특별히 다루는 라이브러리를 보지 못했습니다.

Bundler의 내부에서도 보석 버전을 관리하는 방법을 살펴 보았습니다. 필요한 경우 꽤 복잡한 작업을 할 준비가되어 있습니다. 그러나 나는 그것에 대해 어떻게 가야할지 아직도 불확실하다.

나는 또한 이것을 구현하는 방법에 많은 자유가있다. 그래서 내가 잘못된 나무를 짖고 있다고 생각한다면 그렇게 말하십시오.

어떤 조언을 주셔서 감사합니다.

사이드 노트 : 자바 서블릿 컨테이너의 Classloaders와 비슷한 것을 필요로한다는 사실이 저의 저에게도 제기되었습니다. WAR 파일에는 jar 파일이 포함될 수 있으며 웹 응용 프로그램의 클래스 로더는 전역 클래스 경로에있는 jar 파일의 파일을 선호합니다. 루비에서 "classpath"(즉, load_path, require 등)를 분할하는 방법이 있습니까?

+0

내 문제는 다음과 같은 내용 일 수 있습니다. 두 개의 다른 보석 대신 - 나는 같은 보석의 두 가지 버전을 다루고 있습니다. – codefinger

답변

5

무딘 경우 동일한 보석의 두 가지 버전을 동시에로드 할 수 없습니다.

Bundler는 필요한 모든 보석을 조사하고 다양한 중첩 종속성에 대한 해결책을 찾는 일을하지만, 한 번에 한 버전의 보석 만로드하는 것으로 제한됩니다.

이렇게하면 사용자가 설명하는 상황을 피하기 위해 종속적 인 보석에서 이루어진 모든 변경 사항을 지원하기 위해 지속적으로 업데이트해야하는 플러그인 개발자가 발생합니다.

는 (나 다양한 경쟁 JSON 구현하고 여러 개의 보석이있을 때 거쳐야하는 고통의 결과가 모든 요구하는 다른 사람 종속성 것을 나사 최대에 시작하지 마십시오.)

+0

그건 내가 두려워했던거야. 이것을 설명하는 루비 문서에 대한 어떤 언급을 알고 있습니까? – codefinger

+0

같은 보석의 여러 버전으로 _something_ 할 수있는 여러 명명 된 환경을 안내하는이 기사를 읽을 수 있습니다. http://yehudakatz.com/2010/04/21/named-gem-environments-and-bundler/ 그러나 귀하의 예에서는 플러그인과 동일한 보석 버전을 사용하도록 응용 프로그램을 다시 코딩하거나 플러그인을 포크하십시오 최신 버전의 보석을 지원하고 앱을 동일하게 업데이트했습니다. – stef

0

정중하게 동의 대답은 위와 같다. 어떤을로드 잠금 목록에 특정 버전에 대한 종속성 목록을 생성

ruby -S gem list my_gem

`*** LOCAL GEMS *** 
my_gem (1.0.1, 1.0.0, 0.0.2) 
` 

ruby -S gem lock my_gem-1.0.0 > locklist.rb

지금

require 'rubygems' 
gem 'my_gem', '= 1.0.0' 
gem 'gem_base', '= 1.0.0' 
gem 'rest-client', '= 1.7.2' 
gem 'savon', '= 1.1.0' 
gem 'addressable', '= 2.3.6' 
gem 'mime-types', '= 1.25.1' 
gem 'netrc', '= 0.11.0' 

당신이 load('locklist.rb')을 수행 할 수 있습니다 여기에 내가 그것을 어떻게입니다 의존성과 함께 보석의 특정 버전. 봐, 번들러는 없어.