Подтвердить что ты не робот

Как использовать драгоценные камни не в Gemfile при работе с bundler?

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

В любом случае, или я должен добавить его в Gemfile?

Обновление: моя проблема была не Bundler, а Spork. При запуске 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 `<main>'

Без Bundler:

$ irb
>> require 'fivemat'
=> true
4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

Ответ 2

В 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.

Ответ 3

Вы можете использовать что-то подобное в своем Gemfile:

gem 'foo' if ENV['ENABLE_FOO_GEM']

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

export ENABLE_FOO_GEM=1

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

Ответ 4

Если вы все еще решите сделать это (ужасная идея):

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

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

eval(IO.read('~/.gemfile'), binding) if FileTest.exists?("~/.gemfile")

Ответ 5

Добавить в .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 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