Ruby Gemspec 종속성 : git 분기 종속성이 가능합니까?


82

mygem.gemspec 내부에 자식 분기 종속성이있을 수 있습니까?

나는 다음과 비슷한 것을 생각하고 있습니다.

gem.add_runtime_dependency 'oauth2', :git => 'git@github.com:lgs/oauth2.git'

...하지만 작동하지 않습니다.


git 종속성이 아닌 경로 종속성을 원한다는 점을 제외하고는 이와 동일한 문제가 있습니다. 어떻게 든이 문제를 해결할 방법이 없습니까? 어쩌면 gemspec 어딘가에 해킹 같은 Ruby 코드를 붙인 것일까 요?
Ajedi32

답변:


44

이것은 가능하지 않으며, RubyGems가 gem 개발자가 gem에 액세스하기 위해 특정 버전 제어 시스템을 설치하도록 요구하는 것을 허용하는 것이 다소 부담 스러울 것이기 때문입니다. gem은 사람들이 가능한 한 광범위한 애플리케이션에서 사용할 수 있도록 최소한의 종속성으로 자체 포함되어야합니다.

자신의 내부 프로젝트를 위해이 작업을 수행하려면이 작업을 잘 지원 하는 Bundler 를 사용 하는 것이 좋습니다 .


22
... 예,하지만 어떻게 할 수 있습니까?
Luca G. Soave

33
하지만 나중에 보석이 다른 보석 (예 : foobar_gem)에 포함되면 어떻게됩니까? foobar_gem이 gem의 종속성을 해결하려고 할 때 gemspec 파일에서만 독점적으로 보이지 않습니까?
eremzeit

7
이것에 대한 해결책을 찾았습니까? 저도 똑같은 문제가 있습니까?
msaspence 2013

14
@eremzeit & msaspence-찬성 투표가 너무 많기 때문에 응답해야한다고 느낍니다. 당신이 잘못하고 있기 때문에 이것에 대한 해결책이 없습니다 . Bundler를 사용하는 단일 애플리케이션에 대해 git 저장소에 의존하는 것은 괜찮습니다. 릴리스 된 gem이 GitHub 또는 기타 소스 코드 저장소에 의존하는 것은 완전히 잘못된 것입니다. gem을 릴리스하는 경우 모든 종속성도 gem으로 릴리스되어야합니다. gem과 같은 공식 패키지를 만들려면 아직 출시되지 않은 소스 코드에 의존하는 것은 말 앞에 카트를 두는 것입니다. 이렇게하지 마십시오 .
gtd dec

23
@gtd gem을 만들고 rubygems에서 gem을 릴리스하는 것은 별개의 것입니다. 공개되지 않은 비공개 gem이 자체적으로 비공개 종속성을 가질 수 있습니다. 나에게는 괜찮아 보인다. RubyGems는이 사용 사례에 적합하지 않은 것 같지만 이것이 잘못하고 있다고 확신하지는 않습니다. 그것을 지원할 것이 많지 않습니다. 내가 잘못?
Stephen Crosby

13

편집하다

댓글 작성자에 따르면 이것은 더 이상 사실이 아닙니다. 역사적 맥락을 위해 보관 된 이전 정보.

Gemfile 및 .gemspec의 gem에 대한 참조를 복제하면 이제 Bundler에서 경고 메시지가 발생하는 것처럼 보이므로이 답변은 더 이상 사실이 아닌 것처럼 보입니다.

오래된 정보

Yehuda Katz 의이 기사는 저에게 유사한 혼란을 해결했습니다. 개발 용으로 만 사용하려면 git 항목을 gemfile에 추가하는 것이 가장 좋지만 해당 번 들러는 여전히 gemspec의 종속성 / 버전 정보를 사용합니다 (나에게 마법처럼 보이지만 Yehuda를 신뢰합니다).


3
그게 뭐가 그렇게 마 법적일까요? Bundler는 Gemfile에서만 읽습니다. 단, 여기에 넣으면 gemspec gemspec에서도 읽습니다. bundle install따라서을 실행할 때 Bundler가 Gemfile에 지정된 gem을 설치한다는 것이 발생한다고 가정합니다 (그러나 테스트하지는 않았습니다). Bundler가 이미 설치했기 때문에 requiregem 저장소에서 가져온 것이 아니라는 사실에 관계없이 gem에서 젬을 사용할 수 있습니다 . 마법이 아닙니다. Bundler가 평소처럼 작동합니다.
Marnen Laibow-Koser 2014 년

2
Gemfile 및 .gemspec의 gem에 대한 참조를 복제하면 이제 Bundler에서 경고 메시지가 발생하는 것처럼 보이므로이 대답은 더 이상 사실이 아닌 것 같습니다 ...
Andy Jones

7

나는이 문제도 알아 내려고 애썼다. 그리고 방금 다음과 같은 해결책을 찾았습니다 (귀하의 gem을 게시하거나 해당 oauth2 gem을 재배포 할 권한이 있는지 확실하지 않음).

oauth2 gem이 필요한 gem에서 이것을 실행하십시오.

git submodule add git@github.com:lgs/oauth2.git lib/oauth2

기본값과 다른 분기가 필요한 경우

cd lib/oauth2 && git checkout <branchname_or_ref>
cd .. && git add lib/oauth2
git commit -m "adding outh2 submodule"

gemspec에서 필요한 버전 라인 위에 이것을 추가하십시오.

$:.push File.expand_path('../lib/oauth2/lib', __FILE__)

또한 모든 oauth2 gem의 런타임 종속성을 gemspec에 추가해야합니다. 아직이 문제를 해결할 방법을 찾지 못했습니다.

이것이 내가 한 일이며, 우리 gem은 git을 통해 필요하기 때문에 이것이 rubygems 게시 된 gem에서 작동하는지 확실하지 않기 때문에 작동합니다.


두 gem을 모두 작성했고 둘 다 개발중인 경우 종속성을 하위 모듈로 추가하는 것이 올바른 솔루션입니다.
Benjineer

중요한 것은이 작업을 수행하는 gem 'my_gem', git: 'git@github.com:me/myrepo', submodules: true경우 github에서 설치하는 경우 호스트 응용 프로그램에서 다음 을 사용해야 할 수 있습니다 .
Joe Edgar

1

나는 매우 간단한 해결 방법을 찾았습니다.

프로젝트에 참여 P하고 tools있으며 자체적으로 OS gem 을 사용하는 자체 제작 gem을 사용하고 싶다고 가정 해 보겠습니다 oauth2.

당신이 패치를 만들었고 oauth2당신의 gem에 그 패치가 필요하다면 tools, 당신은 받아 들여진 대답 에 따라 gem에서이 문제를 고칠 수 없을 입니다.

그러나 projet의 Gemfile 내에서 원하는 버전을 지정할 수 있으며 이는 런타임시에서 P사용되는 버전이됩니다 tools.

gem 'oauth2', github: 'lgs/oauth2'

여기 내 실제 사례가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.