2012-02-29 6 views
2

나는 보석을 로컬에서 구축하고 있는데, 이름이 "MyGem"이라고 가정합니다.보석 의존성을 사용하는 Gemfile에서 보석 의존성을 선언하지 않고 보석 의존성을 설정하는 방법은 무엇입니까?

이제 MyGem이 이미 만들어진 보석 (예 : "cancan")에 의존한다고 가정합니다.

그래서, 난 내 mygem.gemspec에 라인을 추가했습니다 : 여기

add_runtime_dependency("cancan") 

문제는 다음과 같습니다

:이처럼 내 gemfile에 추가하여 새로운 프로젝트에 MyGem를 installl 경우
gem "mygem", :path => "path/to/my/local/gem" 

이 새로운 프로젝트는 cancan 메소드를 사용할 수 없으며, 그것을 사용하기 위해 새로운 프로젝트 gemfile에 대해 cancan을 선언해야합니다.

또한 gemspec 메서드를 사용하여 시도했지만 내 문제도 해결하지 못했습니다. 아이디어가 있으십니까?

난 그냥 모든 종속성이 설치되어 bundle install를 실행 한 후 난 단지, myGem 내 새 응용 프로그램 gemfile 선언이있을 때 것을 추가하고 싶었

업데이트. 즉, gem list을 실행하면 "cancan"보석이 표시되지만 응용 프로그램 수준에서 해당 방법에 액세스 할 수 없습니다.

도움 주셔서 감사합니다.

답변

2

좋아,이 문제를 해결했습니다. 이것이 최선의 해결책인지 잘 모르겠지만 작동합니다.

애플리케이션 레벨 개발자로 하여금 자신의 gemfile에 의존성을 추가하도록 만들면 이해가되지 않습니다. 그래서 보석들이 설치 될 때, 나는 단지 내 모든 보석 의존 물들을 필요로했다. my_engine.rb 파일 나의 보석. 그래서

autoload :CanCan, "cancan"

: 예 다음

, 내 my_engine.rb에 나는 더 나은 당신이 할 수있는 다음 줄

require "cancan"

그리고 that'it ... 추가 모듈은 호출 될 때만로드됩니다. 그리고 그보다 나은 점은 사용중인 cancan에서 파일을로드 할 수 있다는 것입니다 (아마도 모든 파일을로드 할 필요가 없을 수도 있습니다).

엔진을 사용하는 경우 my_gem.rb 파일 또는 engine.rb 파일에 해당 행을 추가 할 수 있습니다.

나를 위해 일한 것은이 도움이되기를 바랍니다.

0

add_runtime_dependency 대신 add_dependency를 사용하십시오 (이것은 cancan과 함께 도움이 될 수 있습니다). 그런 다음 새 프로젝트에서 번들 업데이트를 실행하십시오.

+0

답변 해 주셔서 감사합니다. 나는 그것을 시도했지만 작동하지 않았다. 그것은 cancan gem이 설치되지 않은 것처럼 동일한 오류를 발생시킵니다. –

0

"cancan"보석 이름이 실제로 요구되는 이름과 일치합니까?

yajl - 루비 보석에 대한 예 :

Gem::Specification.new do |s| 
    s.name = %q{yajl-ruby} 
... 

그러나 라이브러리를 require'ing 때, 다른 문자열을 사용하십시오 :

require 'yajl' 

당신의 Gemfile에 의미, 당신은해야 명시 적으로 종속성을 요구합니다.

gem 'yajl-ruby', '>=1.0', :require => 'yajl' 

은이 작업을 수행 할 필요 방지하려면, 당신은 "캉캉"의존성의 저자 인 경우, 당신은 보석 이름이 필요 이름과 일치해야합니다.

내가 생각할 수있는 유일한 대안은 소스 파일 중 하나에서 직접 종속성을 요구하는 것입니다 (솔루션에서했던 것처럼).

+0

"Cancan"은 내가 문제를 제시 한 예로 든 보석이었습니다. 실제 실제 문제는로드되지 않는 보석들로 구성되었습니다. 그래서, 그 그룹의 보석에는 실제 이름과 이름이 일치하고 일부는 그렇지 않은 보석이 있었지만 보석은로드되지 않았습니다. 소스를로드하려면로드를 요구해야했습니다. 답변에 감사드립니다. –

관련 문제