Як я можу вказати локальні файли .gem у своєму Gemfile?


158

У мене є пара коштовних файлів, які я встановлюю через gem install xx.gem. Чи можу я сказати Бундлеру їх використовувати? Або мені потрібно вказати вихідний шлях?


Відповіді:


281

Це не зовсім відповідь на ваше запитання про встановлення .gemпакетів, але ви можете вказати всі типи місцеположень на основі gem-by-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 generator_index", щоб зробити його сховищем Gem

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

Нарешті, вкажіть постачальника на це місце, додавши наступний рядок у ваш Gemfile

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

Якщо ви оновлюєте дорогоцінні камені у сховищі, переконайтесь, що регенеруєте індекс.


6
Дякую! Також мені знадобився третій косий ривок, щоб зробити "файл: /// 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/....../
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 в жодній із завершених команд джерел
вдень

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

5
Я думаю, що: path вимагає папку gem з файлом gemspec. У мене є лише файли .gem, які я хочу встановити.
день

1
Гаразд, так пропущено розгортання шапки, але дорогоцінний камінь не встановлено "Немає такого файлу для завантаження - vips": /
день

4
Це, безумовно, неправда, принаймні більше. Bundler не дивиться на ваші системні дорогоцінні камені, а йде лише за тим, що є у Gemfile. Одна з причин, що це так страшно.
bioneuralnet

6

Ви можете змусити постачальника використовувати дорогоцінні камені, які ви розгортаєте, використовуючи "пакетний пакет" та "встановити пакет - місцевий"

На вашій розробці:

bundle install

(Встановлює потрібні дорогоцінні камені та робить Gemfile.lock)

bundle package

(Кешує дорогоцінні камені у постачальника / кеша)

На сервері:

bundle install --local

(- локальне означає "використовувати дорогоцінні камені від постачальника / кеша")


Що робити, якщо я не можу нічого встановити на сервер? У цьому випадку мені потрібно будувати рейки, але сервер не має дорогоцінного каміння, який я використовую для побудови; але я не маю жодних проблем перевірити залежності.
Генрік

"встановлення пакета" не працювало для мене, якщо дорогоцінний камінь не був включений до мого існуючого джерела Gemfile ".
Анна,

Просто видаліть дорогоцінний файл, тимчасово bundle installсформуйте дорогоцінний файл перед тим, як зробити це, після цього скопіюйте gemfile у постачальника / кеша , додайте дорогоцінний камінь назад до gemfile та виконайте bundle install --local
bert bruynooghe

1
bundle packageце чудова пропозиція навіть зараз, через три роки. Якщо ваша версія Bundler старша 2,0 (ще не випущена під час написання), вам потрібно буде скористатися, bundle package --allякщо ви хочете включити дорогоцінні камені pathабо gitзалежності. Це допоможе вам нагадати, якщо виявить такі залежності.
L2G

1
FYI: це може не спрацювати так добре, як ви сподіваєтесь, якщо ви розвинетеся на іншій платформі, ніж для розгортання (наприклад, розробці на macOS, розгортанні до Linux). Відповідно до --localдокументів: "Зауважте, що якщо на rubygems.org існує відповідний дорогоцінний камінь, він не буде знайдений."
Ліам Доусон


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.