Как мне указать локальные файлы .gem в моем Gemfile?


158

У меня есть пара драгоценных файлов, которые я устанавливаю через gem install xx.gem. Могу ли я сказать Bundler использовать их? Или я должен указать исходный путь?


Ответы:


281

Это не является строго ответом на ваш вопрос об установке .gemпакетов, но вы можете указать все виды местоположений на основе самоцветов, отредактировав свой Gemfile .

Указание :pathатрибута установит гем с этого пути на ваш локальный компьютер.

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

Кроме того, указание :gitатрибута установит гем из удаленного репозитория git.

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 файлы из коробки. Указание: пути к каталогу, содержащему файлы .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"

Если вы обновите драгоценные камни в хранилище, обязательно обновите индекс.


6
Спасибо! Кроме того, мне потребовалась третья косая черта, чтобы сделать «file: /// Absolute / Path / to / repo»
Анна

5
Не проще ли запустить «gem server» в командной строке и добавить источник « localhost: 8808 » в свой Gemfile
Анна

Это действительно круто, Мартин! Спасибо за то, что поделились, это именно то, что я искал, так как я не хотел зависеть от запуска и gem serverне хотел размещать весь проект, только файл .gem.
Лео Галлуччи

6
Дополнительный совет: Вы можете обойти требование абсолютного пути, используя File.expand_path как этотsource "file://#{File.expand_path('.')}/chef-11.10.0.dev.2"
Лео Галлуччи

Не работает для меня Mac OS X. Bundler v1.11.2:Could not fetch specs from file://Users/nakilon/....../
Накилон

44

Я бы распаковал ваш драгоценный камень в папке поставщика приложений

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

Затем добавьте путь в Gemfile, чтобы связать распакованный гем.

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

29

По умолчанию Bundler сначала проверит вашу систему, и если он не сможет найти драгоценный камень, он будет использовать источники, указанные в вашем Gemfile.


Правда. но что, если я не установил его раньше? (при развертывании на сервере) Не удалось найти Imlib2-Ruby-0.5.2 ни в одной из исходных команд. Закончено
ddayan

184
вы можете указать на локальный каталог с помощью gem "gemname",: path => "~ / some / local / path"
JHurrah

5
Я думаю, что: путь требует папку gem с файлом gemspec. У меня есть только файлы .gem, которые я хочу установить.
Ддайан

1
Итак, развертывание кэпа прошло, но гем не был установлен "Нет такого файла для загрузки - vips": /
ddayan

4
Это определенно не соответствует действительности, по крайней мере, дольше. Bundler не смотрит на ваши системные гемы, а только следит за тем, что находится в Gemfile. Одна из причин, это так ужасно.
bioneuralnet

6

Вы можете заставить сборщик использовать развернутые гемы, используя «пакет комплекта» и «комплект комплекта --local»

На вашей машине разработки:

bundle install

(Устанавливает необходимые гемы и делает Gemfile.lock)

bundle package

(Кэширует драгоценные камни в вендоре / кеше)

На сервере:

bundle install --local

(--local означает «использовать драгоценные камни из вендора / кэша»)


Что делать, если я не могу ничего установить на сервер? В этом случае мне нужно собрать с помощью rake, но у сервера нет гема, который я использую для сборки; но у меня нет проблем с проверкой зависимостей.
Хенрик

«Установка пакета» у меня не сработала, если драгоценный камень не был включен в мой существующий источник Gemfile
Анна

Просто удалите gem-файл, временно bundle installсоздайте его, затем скопируйте gem-файл в vendor / cache , добавьте gem обратно в gem-файл и выполните bundle install --local
команду

1
bundle packageотличное предложение, даже сейчас, три года спустя. Если ваша версия Bundler старше 2.0 (еще не выпущена на момент написания этой статьи), вам нужно будет использовать ее, bundle package --allесли вы хотите включить гемы pathили gitзависимости. Тем не менее, он даст вам полезное напоминание, если обнаружит такие зависимости.
L2G

1
К вашему сведению: это может работать не так хорошо, как вы надеетесь, если вы разрабатываете на платформе, отличной от той, на которой вы развертываете (например, разработка на macOS, развертывание на Linux) Согласно --localдокументации: «Обратите внимание, что если на rubygems.org существует соответствующий платформенный гем, он не будет найден».
Лиам Доусон


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.