Как заморозить гемы в приложении Rails 3? - PullRequest
17 голосов
/ 05 августа 2010

Я хочу заморозить определенный драгоценный камень в моем приложении Rails.

В рельсах 2 была эта команда:

rake gems:unpack

Я не могу найти эту команду в Rails 3.

Ответы [ 13 ]

21 голосов
/ 26 октября 2010

Итак, короткий ответ, вы не делаете.

Когда вы изменяете свой Gemfile и затем запускаете bundle install или bundle update, упаковщик обрабатывает разрешение зависимостей для вас и определяет лучшие (новейшие) версии каждого требуемого вами гема, который удовлетворяет всей цепочке зависимостей (вы не получит новую версию, которая разбивает другой драгоценный камень в списке зависимостей и т. д.). Конечно, вы также можете поместить определенную версию или спецификацию '> = 1.2.3' или то, что вы указали в Gemfile, используя знакомый синтаксис из config.gem дней, и упаковщик обязательно выполнит это (или выиграл) создать Gemfile.lock, если нет действующего разрешения).

Когда Bundler делает свое дело, он создает файл Gemfile.lock, который (и это при условии, что вы используете только bundler для управления вашим гемом на всех рабочих станциях / средах / развертываниях) выполняет ту же функцию, что и замораживание всех гемов, которые вы используете. требуется Бесплатно! (Проверьте этот файл в системе управления версиями!) Если ваш новый стажер разработки извлекает ваш исходный код на новой машине, ему потребуется одна bundle install, и те же самые версии драгоценных камней, которые вы установили, находятся на ее компьютере. Нажмите для развертывания и выполните bundle install --deployment там (или, более вероятно, добавьте его в ваш Capfile), и те же самые гемы будут установлены (на этот раз в вендор / комплект, настраиваемый). Bundler используется в Rails 3 для управления загрузкой всех драгоценных камней, поэтому, куда бы вы ни указали, чтобы упаковщик установил их (независимо от вашего обычного местоположения gem install по умолчанию, или BUNDLE_PATH (который записывается в .bundle / config, если вы устанавливаете с bundle install --path=foo в противном случае), bundler загрузит нужные, даже если они отличаются от системных гемов.

Вам не нужно распаковывать гемы и регистрировать их в вашем приложении, потому что это не имеет значения: вы гарантируете, что одни и те же версии вызываются независимо от того, где они установлены, что, вероятно, зависит от компьютера В любом случае, на машину (.bundle / не следует регистрировать в репо) - так зачем вставлять в репо еще 60-80 МБ файлов, которые вы никогда не будете изменять или использовать? (кстати, именно поэтому я бы не рекомендовал bundle install --path=vendor/gems , как предложил nfm - это не обязательно неправильно, просто нет никакой выгоды по сравнению с обычным рабочим процессом компоновщика, и теперь ваш размер репо просто увеличился ).

18 голосов
/ 24 ноября 2010

НЕ ИСПОЛЬЗУЙТЕ «РЕКОМЕНДУЕМЫЙ» ОТВЕТ NFM!

Вместо этого просмотрите сайт Bundler, в частности страницу о развертываниях: http://gembundler.com/deploying.html

Краткое резюме - использовать конкретные версии в вашем Gemfile и запускать bundle install --deployment в каждой целевой системе, где вам нужны точные версии gem.

Использование опции --path установит драгоценные камни, но это не совсем то, что вы хотите сделать. Как сказал Мэтт Энрайт, вы просто переполняете свой SCM вещами, которые упаковщик может с умом обрабатывать в каждой целевой среде.

8 голосов
/ 05 августа 2010

Мне еще не приходилось это делать, но я считаю, что все это обрабатывается bundler.

Когда вы создаете новое приложение rails3, зависимости rails помещаются в ваш Gemfile.Вы можете запустить bundle install, чтобы установить их.По умолчанию они устанавливаются в ваш BUNDLE_PATH.

. Если вы хотите установить их в своем приложении, вы можете указать, где: bundle install vendor/gems.

7 голосов
/ 05 апреля 2011

Я должен был сделать это для развертывания typeus gem на Heroku, поскольку вы не можете запустить heroku rails generate typus на Heroku, учитывая, что это файловая система только для чтения. Я не хотел, чтобы ВСЕ приложение добавлялось в мое приложение, только то, что вызывало у меня горе. Вот шаги, которые ведут к успеху:

  1. создать каталог в app_name / vendor / gems / gem_name (необязательно) ... в моем случае / app_name / vendor / gems / typus

  2. добавьте в gemfile следующее (это указывает комплекту, где найти и поместить источник gem):

    gem 'typus',: git => 'https://github.com/fesplugas/typus.git',: path => "vendor / gems / typus"

  3. затем из каталога вашего приложения (это установит гем в ваше приложение):

    'gem unpack typus - целевой поставщик / gems / typus'

  4. затем bundle install

  5. тогда .. в моем случае ... зафиксируйте и отправьте в хранилище, а затем разверните до героку ... возможно, вам придется запустить heroku rake db:migrate

1 голос
/ 30 августа 2013

Я второй ответ от Цега (обновлено Coreyward).«пачка» - это общий ответ.

Автор не просил, ГДЕ заморозить его драгоценные камни.Он хотел знать, КАК.Ответы типа «Просто не делай этого» вообще не помогают.Да, оказалось, что его конкретная проблема немного отличалась от этой, но хотя «пакетный пакет» мог быть излишним, он все равно решает проблему.

Я работал на многих системах, а на некоторых выпросто не имею полного доступа.Установка драгоценных камней в некоторых системах просто не вариант.Так что если вы не упаковываете их, в общем, вы облажались.Для разных хостов и систем существуют разные обходные пути, но для некоторых нет.

1 голос
/ 12 июня 2011

Вы можете установить пакет на Dreamhost без проблем.Если вы используете общий доступ, среда уже настроена для локального хранения их в вашем домашнем каталоге.Если вы используете VPS или Dedicated, вы можете запустить пакетную установку от имени пользователя root или просто добавить это в свой .bash_profile

export GEM_HOME=$HOME/.gems
export GEM_PATH=$GEM_HOME:/usr/lib/ruby/gems/1.8
1 голос
/ 02 мая 2011

Я думаю, что вы ищете

bundle package

Оформить справочные страницы здесь: http://gembundler.com/man/bundle-package.1.html

1 голос
/ 05 августа 2010

Предполагается, что у вас уже есть связка самоцвет :

  • $ bundle lock
  • $ git add Gemfile.lock
0 голосов
/ 19 января 2012

Инструкции по очистке для опции gem unpack и :path =>:

0 голосов
/ 10 июня 2011

Многие комментарии в какой-то мере говорят о том, что использовать пакетную установку --path vendor / gems бесполезно, но тем, кто использует Dreamhost, следует помнить, что вы не можете использовать пакетную установку в Dreamhost.

Решение состоит в том, чтобы поместить все драгоценные камни в папку продавца и загрузить все это в каталог Dreamhost.

Существуют и другие решения, чтобы обойти это, но сделать это гораздо сложнее.

...