Rails необязательный gem config - PullRequest
7 голосов
/ 22 января 2010

Что вы делаете, когда хотите использовать гем для разработки / тестирования, который вы не хотите заставлять использовать другие разработчики? Прямо сейчас у меня есть

begin
  require 'redgreen'
rescue LoadError
end

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

config.gem "redgreen", :optional => true

Есть еще предложения? Или я должен просто продать эти довольно поверхностные драгоценные камни ...?

EDIT

Для ясности, я говорю только о тех конкретных драгоценных камнях, как redgreen, которые на самом деле не используются в функциональном коде, а только в кодировании process . Их вообще не нужно продавать, за исключением случаев, когда требуется условное требование.

Ответы [ 7 ]

7 голосов
/ 11 ноября 2011

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

Классическим примером является ruby-debug-base19x, который требуется Rubymine для отладки. Он установлен в вашем локальном наборе гемов, но не в Gemfile, потому что не все кодеры используют Rubymine.

[EDIT]

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

Я нашел много хороших решений в этом выпуске сборщика .

Самым хорошим решением было добавить это к вашему .irbrc:

# Add all gems in the global gemset to the $LOAD_PATH so they can be used even
# in places like 'rails console'. 
if defined?(::Bundler)   
  global_gemset = ENV['GEM_PATH'].split(':').grep(/ruby.*@global/).first 
  if global_gemset
    all_global_gem_paths = Dir.glob("#{global_gemset}/gems/*")
    all_global_gem_paths.each do |p|
      gem_path = "#{p}/lib"
      $LOAD_PATH << gem_path
    end   
  end 
end

require 'irb/completion' 
require 'rubygems' 
require 'wirble'

Wirble.init 
Wirble.colorize

Если затем установить wirble на набор global, его можно найти. Оригинальный источник: https://gist.github.com/794915

Надеюсь, это поможет.

2 голосов
/ 15 ноября 2011

Я ответил на похожий вопрос здесь

Пользовательский пакет Gemfile

Один из способов сделать это - создать разные среды

group :scott do 
end

Тогда

bundle --with-env = scott

1 голос
/ 11 ноября 2011

По моему мнению, это то, для чего нужна среда. К счастью, есть также способ сделать это с тем, что находится в вашем Gemfile, это также как rails использует это: groups

Практически все используют окружение так же, как и рельсы. Вот что вы можете найти в вашем Gemfile:

group :test do
  # Pretty printed test output
  gem 'turn', :require => false
end

А вот что вы можете найти в вашем config / application.rb

Bundler.require(:default, Rails.env) if defined?(Bundler) 

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

Вот несколько ссылок: http://yehudakatz.com/2010/05/09/the-how-and-why-of-bundler-groups/ http://gembundler.com/groups.html

1 голос
/ 10 ноября 2011

Хорошо, я думаю, что что-то придумал. По сути, идея состоит в том, чтобы выполнять вторичный Gemfile только тогда, когда выполняется приложение Rails. Для этого добавим две вещи:

Сначала немного изменим скрипт rails:

# in ./script/rails

Kernel::IN_RAILS_APP = true

APP_PATH = File.expand_path('../../config/application',  __FILE__)
require File.expand_path('../../config/boot',  __FILE__)
require 'rails/commands'

Во-вторых, мы сообщаем, что упаковщик загружает дополнительный Gemfile, если мы находимся в приложении rails и существует вторичный файл:

# Gemfile

if Kernel.const_defined?(:IN_RAILS_APP)
  local_gemfile = File.dirname(__FILE__) + "/Gemfile.local"
  if File.exists?(local_gemfile)
    puts 'using local gemfile'
    self.instance_eval(Bundler.read_file(local_gemfile))
  end
end

Теперь вы можете добавить Gemfile.local в ваш проект и запускать определенные гемы для каждого компьютера. bundle install работает нормально, поскольку константа IN_RAILS_APP не существует.

** Обязательно добавьте Gemfile.local к вашему .gitignore.

0 голосов
/ 18 октября 2013

Я решил это, поместив это в файл gem:

$gem_names ||= ENV['GEM_PATH'].split(':').map{|g| Dir.glob("#{g}/gems/*").map{|p|p.split('/gems/').last}}.flatten

gem 'redgreen' if $gem_names.any?{|n| n=~/redgreen/ }

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

Это работает хорошо, но имеет недостаток, заключающийся в том, что он помещает имя драгоценного камня в Gemfile.lock. Это не имеет большого значения, потому что гем не устанавливается с bundle install, но он делает ваш файл блокировки немного грязным и может привести к небольшому изменению файла блокировки от одного разработчика к следующему.

Если это проблема для вас, другой вариант - сохранить гемфайл в чистоте и требовать, чтобы драгоценный камень содержал полный путь, или вы можете добавить путь только для этого драгоценного камня. Как это:

$gem_paths ||= ENV['GEM_PATH'].split(':').map{|g| Dir.glob("#{g}/gems/*")}.flatten
$gem_paths.grep(/redgreen/).each {|p|$LOAD_PATH << p+'/lib'}
require 'redgreen' rescue nil
0 голосов
/ 12 октября 2011

Вот как я решил ту же проблему в Rails 3.1. В моем Gemfile:

if File.exists? './tmp/eric_dev_gems'
  gem 'redgreen'
  gem 'awesome_print'
  gem 'wirble'
  gem 'wirb'
  gem 'hirb'
end

Создайте файл в ./tmp/ (или в другой папке, которая находится в вашем .gitignore) по вашему выбору. Я использовал eric_dev_gems. Это должно быть проигнорировано git и будет существовать только в вашей системе, если только один из ваших товарищей по команде не решит, что он тоже хочет создать этот файл.

0 голосов
/ 22 января 2010

Если вы хотите, чтобы это было необязательно, лучше заморозить драгоценный камень как плагин. Однако не стоит использовать другие гемы, чем остальная часть команды разработчиков, так как это создает некоторые несоответствия в базе кода, которые потом будет сложно отследить. Я бы сказал, добавьте его в config.gem и просто попросите других разработчиков сделать:

rake gems:install

И все готово.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...