보석을 설치할 때 조건부로 의존성을 설정해야하는 보석 작업을하고 있습니다. 나는 약간의 파기를했다루비 보석을 만들고 의존성을 조건부로 지정합니다.
그리고 그것은 내가이 필요에 혼자가 아닌 것처럼 보인다.
Rubygems: How do I add platform-specific dependency?
이 긴 스레드
http://www.ruby-forum.com/topic/957999
나는 보석이의 보석 :: Specifiction 블록 내에서 방법을 add_dependency 사용하는 것입니다에 종속성을 추가하기 위해 볼 수있는 유일한 방법에게 있습니다. gemspec 파일
Gem::Specification.new do |s|
# ... standard setup stuff
# conditionally set dependencies
s.add_dependency "rb-inotify", "~> 0.8.8" if RUBY_PLATFORM =~ /linux/i
s.add_dependency "rb-fsevent", "~> 0.4.3.1" if RUBY_PLATFORM =~ /darwin/i
s.add_dependency "rb-fchange", "~> 0.0.5" if RUBY_PLATFORM =~ /mswin|mingw/i
end
그물에서 찾은 모든 문서와 스레드를 기반으로했을 때, RB-fsevent가 설치 될
- 리눅스에 보석을 설치하는 경우 t는, 다음, RB-inotify를 종속성 및 자동 설치
- 맥 것이다 RB-fchange가 설치된다
그러나 그렇다고 볼 수 없습니다. 블럭 내의 "if"문은 보석이 만들어지고 패키징 될 때 평가됩니다. 따라서 Linux에서 gem을 빌드하고 패키지하면 rb-inotify가 종속성, Mac, rb-fsevent, Windows-rb-fchange로 추가됩니다.
여전히 솔루션이 필요하므로 루비 젬 코드를 둘러 보았습니다. 다음과 같은 일이 발생하는 경우가 많습니다.
- 빌드 당신의 보석에 대한 모든 코드 : foo.gem
- 는 foo.gemspec 파일
- 빌드, 패키지를 만들고, 같은 rubygems.org
- 같은 보석 서버에 보석을 해제 모두들
- 개발자는 다음을 통해 로컬로 설치합니다. gem install foo
- foo.gem 파일이 다운로드되고 압축이 풀린 후 설치됩니다. 모든 종속성도 설치됩니다.
- 모든 항목을 설정해야하며 보석을 사용하여 고정 할 수 있습니다.
보석이 지어 놓을 때 foo.gemspec 파일을로드하고 보석 :: 사양 블록이 평가 YAML로 변환되고, metadata.gz로 압축하고, foo.gem에 포함 된 것으로 보인다 . 루비 코드는 data.tar.gz로 압축되어 포함됩니다. gem이 로컬 개발자 머신에 설치되면 YAML이 metadata.gz에서 추출되고 다시 Gem :: Specification 블록으로 변환되지만 다시 원래 블록으로 변환되지 않습니다.
Gem::Specification.new do |s|
if s.respond_to? :specification_version then
s.specification_version = 3
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
s.add_runtime_dependency(%q<rb-inotify>, ["~> 0.8.8"])
else
s.add_dependency(%q<rb-inotify>, ["~> 0.8.8"])
end
else
s.add_dependency(%q<rb-inotify>, ["~> 0.8.8"])
end
end
확인 :
대신, 다음과 같은 것을 볼 수 있습니다.그래서, 저는 프로세스의 조감도를 보았습니다. 그것은 하나의 보석을 만들고 욕망을 변화시키지 않고 OS 타겟 범위에 대한 의존성을 조건 적으로 지정합니다.
누구든지 각 대상 OS에 대해 여러 .gemspec 파일을 만드는 것 이외의 솔루션을 가지고 있다면 ... 나는 모두 귀입니다 !!
내 대답을 봐 http://stackoverflow.com/a/10249133/309514, 잘 작동합니다. – Fotios