Gemfile에서 로컬 .gem 파일을 어떻게 지정합니까?


답변:


281

이것은 .gem패키지 설치에 대한 질문에 대한 대답은 아니지만 Gemfile 을 편집하여 모든 종류의 위치를 ​​젬 단위로 지정할 수 있습니다.

:path속성을 지정하면 로컬 시스템의 해당 경로에서 gem을 설치합니다.

gem "foreman", path: "/Users/pje/my_foreman_fork"

또는 :git속성을 지정하면 원격 git 저장소에서 gem을 설치합니다.

gem "foreman", git: "git://github.com/pje/foreman.git"

# ...or at a specific SHA-1 ref
gem "foreman", git: "git://github.com/pje/foreman.git", ref: "bf648a070c"

# ...or branch
gem "foreman", git: "git://github.com/pje/foreman.git", branch: "jruby"

# ...or tag
gem "foreman", git: "git://github.com/pje/foreman.git", tag: "v0.45.0"

( @JHurrah그의 의견 에서 언급했듯이 )


또한 일부 방화벽의 경우 git 프로토콜이 문제 일 수 있습니다. 이 경우 시도gem "foreman", :git => "https://github.com/pje/foreman.git"
kode

61

번 들러는 즉시 .gem 파일을 사용할 수 없습니다. : path를 .gem 파일을 포함하는 디렉토리로 지정하면 작동하지 않습니다. 일부 사람들은 그러한 목적으로 로컬 gem 서버 (geminabox, stickler)를 설치하도록 제안했습니다.

그러나 내가 훨씬 더 간단하게 발견 한 것은 파일 시스템에서 로컬 gem "서버"를 사용하는 것입니다. .gem 파일을 로컬 디렉토리에 넣은 다음 "gem generate_index"를 사용하여 Gem 저장소로 만드십시오.

mkdir repo
mkdir repo/gems
cp *.gem repo/gems
cd repo
gem generate_index

마지막으로 Gemfile에 다음 줄을 추가하여 번 들러를이 위치로 지정하십시오.

source "file://path/to/repo"

저장소에서 gem을 업데이트하는 경우 인덱스를 재생성하십시오.


6
감사! 또한 "file : /// Absolute / Path / to / repo"를 수행하기 위해 세 번째 슬래시가 필요했습니다
Anna

5
명령 행에서 "gem server"를 실행하고 소스 " localhost : 8808 "을 Gemfile에 추가하는 것이 쉽지 않을까요
Anna

정말 멋진 마틴입니다! 공유해 주셔서 감사합니다. 실행에 의존하고 싶지 않았기 때문에 gem server전체 프로젝트, .gem 파일을 호스팅하고 싶었 기 때문에 정확히 찾고 있었습니다.
레오 Gallucci

6
보너스 팁 : File.expand_path를 사용하여 절대 경로 요구 사항을 해결할 수 있습니다.source "file://#{File.expand_path('.')}/chef-11.10.0.dev.2"
Leo Gallucci

나를 위해 작동하지 않습니다. Mac OS X. Bundler v1.11.2 :Could not fetch specs from file://Users/nakilon/....../
Nakilon

44

응용 프로그램 공급 업체 폴더에서 보석을 풀고 싶습니다.

gem unpack your.gem --target /path_to_app/vendor/gems/

그런 다음 Gemfile에 경로를 추가하여 압축 해제 된 gem을 연결하십시오.

gem 'your', '2.0.1', :path => 'vendor/gems/your'

29

기본적으로 Bundler는 먼저 시스템을 검사하고 보석을 찾을 수 없으면 Gemfile에 지정된 소스를 사용합니다.


진실. 그러나 이전에 설치하지 않은 경우 어떻게해야합니까? (서버에 배포 할 때) 아무 source 명령에서나 Imlib2-Ruby-0.5.2를 찾을 수 없습니다
ddayan

184
gem "gemname", : path => "~ / some / local / path"를 가진 로컬 디렉토리를 가리킬 수 있습니다
JHurrah

5
나는 : path에 gemspec 파일이있는 gem 폴더가 필요하다고 생각합니다. 설치하려는 .gem 파일 만 있습니다.
ddayan

1
좋아 캡 배포는 통과하지만 보석은 "부하에 해당 파일 - VIP를"설치하지 그래서 : /
ddayan

4
적어도 더 이상은 사실이 아닙니다. 번 들러는 시스템 젬을 보지 않으며 Gemfile의 내용 만 따릅니다. 그것이 끔찍한 이유 중 하나입니다.
bioneuralnet 2012

6

"번들 패키지"및 "번들 설치 --local"을 사용하여 배치 한 gem을 번 들러가 강제로 사용할 수 있습니다.

개발 머신에서 :

bundle install

(필요한 gem을 설치하고 Gemfile.lock을 만듭니다)

bundle package

(공급 업체 / 캐시에서 보석을 캐시)

서버에서 :

bundle install --local

(--local은 "공급 업체 / 캐시의 gem 사용"을 의미)


서버에 아무것도 설치할 수 없으면 어떻게합니까? 이 경우 레이크를 사용하여 빌드해야하지만 서버에는 빌드에 사용하는 gem이 없습니다. 그러나 종속성을 확인하는 데 아무런 문제가 없습니다.
Henrik

보석이 기존 Gemfile "소스에 포함되어 있지 않으면"번들 설치 "가 작동하지 않습니다.
Anna

gem 파일을 삭제하기 전에 gem 파일을 일시적으로 제거하십시오. 그 bundle install후 gemfile을 vendor / cache에 복사하고 gem을 gemfile에 다시 추가 한 다음 실행하십시오 bundle install --local
bert bruynooghe

1
bundle package3 년 후인 지금도 큰 제안입니다. Bundler 버전이 2.0보다 오래된 경우 (이 글에서 아직 출시되지 않은 bundle package --all경우) 보석을 포함 path하거나 git종속성 을 포함 하려면 사용해야 합니다 . 그러나 그러한 종속성을 감지하면 유용한 알림을 제공합니다.
L2G

1
참고 : 배포하지 않은 다른 플랫폼에서 개발하는 경우 (예 : macOS에서 개발, Linux에 배포) 원하는대로 작동하지 않을 수 있습니다. 당으로 --local문서 : "는 해당 플랫폼 별 보석이 rubygems.org에있는 경우 참고 그것을 찾을 수 없습니다 것입니다."
Liam Dawson 1

1

에 추가 .gem하는 vendor/cache것이 작동 하는 것 같습니다. 에 옵션이 필요하지 않습니다 Gemfile.


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