Як я можу вказати локальні файли .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.