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

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


person ddayan    schedule 12.04.2011    source источник
comment
Связанный: stackoverflow.com/questions/4487948/   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 01.09.2019


Ответы (7)


Это не совсем ответ на ваш вопрос об установке .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 в его комментарий.)

person pje    schedule 31.01.2013
comment
Также для некоторых брандмауэров протокол git может быть проблемой. В таком случае попробуйте gem "foreman", :git => "https://github.com/pje/foreman.git" - person kode; 11.12.2013

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

Если вы обновляете драгоценные камни в репозитории, обязательно перегенерируйте файл index.

person Martin Thiede    schedule 12.09.2012
comment
Спасибо! Кроме того, мне нужна третья косая черта, чтобы сделать file:///Absolute/Path/to/repo - person Anna; 02.10.2012
comment
Не проще ли запустить сервер gem из командной строки и добавить источник localhost:8808 в ваш Gemfile - person Anna; 10.10.2012
comment
Это очень круто Мартин! Спасибо, что поделились, это именно то, что я искал, так как я не хотел зависеть от запуска gem server и не хотел размещать весь проект, только файл .gem. - person Leo Gallucci; 16.12.2013
comment
Дополнительный совет: вы можете обойти требование абсолютного пути, используя File.expand_path следующим образом source "file://#{File.expand_path('.')}/chef-11.10.0.dev.2" - person Leo Gallucci; 16.12.2013
comment
Не работает для меня. Mac OS X. Сборщик v1.11.2: Could not fetch specs from file://Users/nakilon/....../ - person Nakilon; 10.02.2016
comment
@Nakilon У меня была такая же проблема, но потом я понял, что не положил свой драгоценный камень в папку gems папки repo, а только в папку repo. Вы создали папку gems? - person Asier; 04.03.2016
comment
Для меня это отличное решение, так как я работаю за корпоративным брандмауэром, через который gem не может проникнуть. Поэтому я загружаю файлы gem вручную с rubygems.org и создаю свой собственный репозиторий. - person Robert Brown; 11.04.2016
comment
Большое спасибо. Это сработало для меня, так как gem server возвращал 404, когда сборщик пытался установить драгоценные камни (хотя я мог видеть страницу репо на локальном хосте, и gem install --source localhost... работало). - person Samuel Garratt; 22.03.2018
comment
Супер трюк! вот небольшое дополнение для этого. Как проверить, что драгоценные камни теперь доступны локально: список драгоценных камней -r --clear-sources -s file:/repo - person Алексей Лещук; 09.10.2019

Я бы распаковал ваш гем в папку поставщика приложения

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

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

gem 'your', '2.0.1', :path => 'vendor/gems/your'
person edap    schedule 30.05.2014

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

person JHurrah    schedule 12.04.2011
comment
Истинный. но что, если я не установил его раньше? (при развертывании на сервере) Не удалось найти Imlib2-Ruby-0.5.2 ни в одном из исходников. Команда завершена - person ddayan; 12.04.2011
comment
вы можете указать на локальный каталог с помощью gem name, :path =› ~/some/local/path - person JHurrah; 12.04.2011
comment
Я думаю, что для :path требуется папка gem с файлом gemspec. У меня есть только файлы .gem, которые я хочу установить. - person ddayan; 12.04.2011
comment
Да, похоже, мне нужно было указать версию, интересно, почему он всегда говорил мне, какую версию он искал. для примера Не ​​удалось найти ruby-vips-0.1.0 ни в одном из источников, сейчас указал гем 'ruby-vips' '=0.1.0', :path =›.... и все работает. Спасибо. - person ddayan; 13.04.2011
comment
Итак, деплой шапки прошел, но гем не установился Нет такого файла для загрузки -- vips :/ - person ddayan; 13.04.2011
comment
Это определенно неправда, по крайней мере, больше. Bundler не смотрит на ваши системные гемы, а только на то, что находится в Gemfile. Одна из причин, почему это так ужасно. - person bioneuralnet; 03.02.2012
comment
@ddayan, какое-нибудь решение проблемы «Нет такого файла для загрузки»? Я сам сталкиваюсь с тем же. bundle install работает отлично и денди, но как только вы вызываете require 'yourgame', он не может его включить. - person garbagecollector; 18.08.2016
comment
› Это определенно неправда, по крайней мере, в настоящее время. Bundler не смотрит на ваши системные гемы, а только на то, что находится в Gemfile. Одна из причин, почему это так ужасно. Согласованный. Этот ответ неверен (больше? может быть, это было когда-то). - person jmoney; 27.01.2019

Вы можете заставить упаковщик использовать драгоценные камни, которые вы развертываете, используя «bundle package» и «bundle install --local».

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

bundle install

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

bundle package

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

На сервере:

bundle install --local

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

person Henry Collingridge    schedule 02.06.2011
comment
Что делать, если я не могу ничего установить на сервер? В этом случае мне нужно собрать с помощью rake, но на сервере нет драгоценного камня, который я использую для сборки; но у меня нет проблем с проверкой зависимостей. - person Henrik; 08.02.2012
comment
У меня установка пакета не работала, если гем не был включен в мой существующий исходный код Gemfile. - person Anna; 02.10.2012
comment
Просто временно удалите файл gem из файла gem перед выполнением bundle install После этого скопируйте файл gem в vendor/cache, добавьте камень обратно в файл gem и выполните bundle install --local - person bert bruynooghe; 28.08.2013
comment
bundle package — отличное предложение даже сейчас, три года спустя. Если ваша версия Bundler старше 2.0 (еще не выпущенная на момент написания этой статьи), вам нужно будет использовать bundle package --all, если вы хотите включить гемы с path или git зависимостями. Однако он даст вам полезное напоминание, если обнаружит такие зависимости. - person L2G; 24.06.2014
comment
К вашему сведению: это может работать не так хорошо, как вы надеетесь, если вы разрабатываете на другой платформе, чем вы развертываете (например, разрабатываете на macOS, развертываете на Linux). В соответствии с документами --local: обратите внимание, что если на rubygems.org существует соответствующий гем для конкретной платформы, он не будет найден. - person Liam Dawson; 04.03.2019

Добавление .gem к vendor/cache похоже работает. В Gemfile параметры не требуются.

person Victor Moroz    schedule 17.08.2018

Я обнаружил, что проще всего запустить свой собственный сервер gem, используя geminabox

См. эти простые инструкции.

person Dave Sag    schedule 30.07.2015