Вопрос по ruby, bundler, rubygems – Как использовать гемы не в Gemfile при работе с bundler?

21

При использовании bundler с проектом в целом и Rails в частности, вы имеете доступ только к гемам, определенным в вашем Gemfile. Хотя это имеет смысл, оно может быть ограничивающим. В основном, я нахожу это ограничивающим, когда я хочу использовать определенный форматер RSpec, чего не делает остальная командат использовать. Разве это»в Gemfile, это нет доступным.

Любой способ обойти это, или я должен добавить его в Gemfile?

Обновление: моя проблема не былаБандлер но Спорк. Когда я запускал RSpec без Spork, у меня не было проблем с использованием любого желаемого форматера.

Обновление № 2: похоже, что использование Bundler все еще является причиной проблемы. Разница между использованием Spork и неиспользованием Spork заключается в том, что при запуске RSpec без Spork он загружает средство форматирования перед загрузкой проекта и получением в Bundler »песочница».

С Bundler:

$ bundle exec irb
>> require 'fivemat'
LoadError: cannot load such file -- fivemat

from (irb):1:in `require'
from (irb):1
from /Users/arikfr/.rvm/rubies/ruby-1.9.3-p194/bin/irb:16:in `'

Без Bundler:

$ irb
>> require 'fivemat'
=> true
Проблема с OS X / Linux может быть решена в Gemfile путем проверки платформы Rubygithub.com/carlhuda/bundler/issues/663#issuecomment-2849045 Peter Brown
@ Beerlington, но это только позволит избежать этого. Я нене хочу его устанавливать вообще. И вообще я нене хочу загрязнять Gemfile вещами, которые я Нужна в разработке, а остальная часть команды нет. arikfr
Почему Дон'Вы добавляете FiveMat в свой гемфайл? Peter Brown
В основном, я нахожу это ограничивающим, когда я хочу использовать определенный форматер RSpec, чего не делает остальная командат использование «. тот'почему? Также иногда я хочу использовать гемы, которые поддерживаются в OS / X, но не поддерживаются в Ubuntu (и наоборот). arikfr

Ваш Ответ

5   ответов
15

ВChiliProject мы позволяем пользователям создаватьGemfile.local который входит в основнойGemfile в процессе. Это позволяет пользователям указывать дополнительные драгоценные камни без необходимости менять нашиGemfile чтобы облегчить обновления.

Для этого мы включили следующий кодв нижней части нашего Gemfile.

gemfile_local = File.expand_path('Gemfile.local', __dir__)
if File.readable?(gemfile_local)
  puts "Loading #{gemfile_local}..." if $DEBUG
  instance_eval(File.read(gemfile_local))
end

Gemfile.local Сам исключен из хранилища через..gitignore

В этом решенииGemfile.lock зависит отGemfile.local, Так что он выиграл»хорошо работает для проектов, гдеGemfile.lock отслеживается VCS.I ' user1614572
хорошее, элегантное решение! Jack Juiceson
Это отлично сработало для меня! Это должен быть принятый ответ. :) Graham Swan
Мне любопытно о потенциальных последствиях этого подхода, когдаGemfile.lock отслеживается системой контроля версий. Один заканчивается спецификациями вGemfile.lock что нене обязательно относится к другим разработчикам Gemfiles. Я догадываюсь, что Bundler может разумно устранить эти несоответствия, не вызывая каких-либо реальных проблем, но меня беспокоит, что /Gemfile.lock потенциально может быть не синхронизирован друг с другом. AvidArcher
1

Вы можете использовать что-то вроде этого в вашем Gemfile:

gem 'foo' if ENV['ENABLE_FOO_GEM']

Затем просто установите ENABLE_FOO_GEM в вашей среде.

export ENABLE_FOO_GEM=1

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

0

добавить в.gitignore

Gemfile.local
Gemfile.local.lock

Добавить к проекту аGemfile.local.sample файл со следующим содержанием:

# Include gems that are note meant to be part of the project but for development purposes
# That's why Gemfile.local and Gemfile.local.lock must be git-ignored

# To use these gems:
#   1. Create a "Gemfile.local" file (at same level of "Gemfile")
#   2. Prepend "BUNDLE_GEMFILE=Gemfile.local" before "bundle install" or "bundle exec rails c" and so forth.

eval_gemfile "./Gemfile"

group :development, :test do
  # Suggested gems
  gem "awesome_print", require:"ap"
  gem "hirb"
  gem "pry"
  gem "pry-byebug"
  gem "pry-rails"
  gem "meta_request"

  # My gems
  gem "fivemat"
end
0

На случай, если вы все-таки решите сделать это (ужасная идея):

Вы можете добавить код ruby в свой Gemfile, чтобы загрузить ~ / .gemfile (или такой), если он существует.

Что-то вроде:

eval(IO.read('~/.gemfile'), binding) if FileTest.exists?("~/.gemfile")
Были и похожие мысли, можетЯ просто: require_relative '~ / .Gemfile» вместо Eval? arikfr
10

Я предполагаю, что ни один из этих ответов не был выбран как правильный, потому что они нене справиться с задачей: иметь дополнительные драгоценные камни, которые вы можете использовать,по умолчанию дон»Для этого не требуется вносить какие-либо изменения в файлы, уже находящиеся в хранилище. То есть ты нене нужно изменять какие-либо файлы, и вы нея должен жить, помня, чтобы не проверять ваши локальные изменения. Вот'как я это делаю

Идея в основном инвертирует зависимости Хольгераответ, такой, что естьНет необходимости изменять общий Gemfile. Bundler позволяет указатькакой файл будет использоваться в качестве gemfile, но странно документированные методывидимо не работает с его конфигурационным файлом и не будет исправлен, В Bundler есть несколько скрытая особенность, заключающаяся в том, что любой из параметров конфигурации может быть установлен в переменной среды или передан в командной строке. Выполнение всех ваших команд какbundle [command] --gemfile [yourgemfile] или жеBUNDLE_GEMFILE="[yourgemfile]" bundle [command] заставит Bundler читать любой гемфайл, который вы хотите. Я настоятельно рекомендую использовать подход с использованием переменных среды и либо создать псевдоним, либо экспортировать переменную для текущего сеанса, особенно потому, что я не смог использовать параметр командной строки с параметром "Exec» команда.

Поэтому я запускаю rspec так:BUNDLE_GEMFILE="[mygemfile]" bundle exec rspec [filename]и у меня есть первая часть этого псевдонима какbem в моем башрч. Работает как шарм.

Затем вы должны настроить свой источник управления, чтобы игнорировать ваш Gemfile, либо в проекте 's .gitignore или, чтобы сохранить проект полностью гигиеничным, не меняя даже его .gitignore, на ваш личный глобальный файл игнорирования (который по умолчанию находится в~/.config/git/ignore и имеет тот же формат, что и проектs gitignore file).

Еще одна вещь, которую стоит отметить, это то, что Bundler создаст файл блокировки на основе Gemfile 'имя Это очень удобно, так как удерживает вас от перезаписи вашего проекта.s Gemfile.lock, если этоВключено, но вы должны также игнорировать этот новый файл блокировки. Если ваш гемфайлFoo.bar, Ищу .Foo.bar.lock

Наконец, вы можете сделать что-то похожее на ХольгерПредложение в вашем пользовательском Gemfile:

source "http://rubygems.org"
gem "fivemat"
instance_eval(File.read(File.dirname(__FILE__) + "/Gemfile"))

и ты'хорошо, если вы не забыли указать свой Gemfile.

Я также хотел бы указать вам на мерзавцаисключениям, которые похожи на игнорируемые файлы, за исключением того, что это нене записывать, что этоs проигнорировал их. Чтобы исключить файл, специфичный для репозитория, укажите путь к нему в/.git/info/excludeтак же, как вы бы в.gitignore файл. PJSCopeland
Вы можете обновить Gemfile.lock (в отличие от Foo.bar.lock) с помощью I 'bundle --gemfile Gemfile Ritchie
Этот подход является лучшим, яЯ знаю, но, к сожалению, не сохраняет версии gem во включенном Gemfile 's Gemfile.lock. Я хотел бы видеть решение, которое сделало. Dave Schweisguth
мы создалиэто репо который вы можете раскошелиться и клонировать в каталогв ваше приложение, чтобы получить большую часть этой функциональности. Ritchie

Похожие вопросы