Зависящие от платформы драгоценные камни для автотестирования с помощью bundler

#ruby-on-rails #bundler #autotest #gemfile

#ruby-on-rails #bundler #автотестирование #gemfile

Вопрос:

В проекте rails, над которым я работаю, я вставил поддержку rspec, cucumber и автотестирования с помощью этого Gemfile (частично)

 gem 'rspec-rails'
gem 'cucumber-rails'
gem 'autotest-standalone'
gem 'autotest-rails-pure'
gem 'zentest-without-autotest'
  

однако для запуска тестов с помощью автотестирования мне нужно выполнить bundle exec autotest в противном случае он завершается ошибкой с этим сообщением

 $ autotest 
loading autotest/cucumber_rails_rspec_rspec2
Error loading Autotest style autotest/cucumber_rails_rspec_rspec2 (no such file to load -- autotest/cucumber_rails_rspec_rspec2). Aborting.
  

Сейчас я разрабатываю на Mac и хотел бы включить драгоценные камни autotest-growl и autotest-fsevents, но если я вставлю эти строки в свой ~/.autotest

 require 'autotest/growl'
require 'autotest/fsevent'
  

затем мне нужно вставить соответствующие драгоценные камни в Gemfile, и все работает, но это нарушает сборки на моем сервере CI (который находится в Linux)

Как решить эту проблему, не поддерживая другой Gemfile для локальных сред и CI?

Редактировать:

На данный момент я решил проблему с помощью этих строк в Gemfile

 if RUBY_PLATFORM.downcase.include?("darwin") # I'm on Mac
  gem 'autotest-fsevent'
  gem 'autotest-growl'
end
  

Это работает как локально, так и на сервере CI, я не знаю, не испортило ли это что-то, на данный момент кажется, что это работает безупречно.

Любой более чистый способ сделать это по-прежнему приветствуется.

ПРАВКА2:

Я переключился на групповые решения. Хотя предыдущий monkeypatch довольно хорошо работает как при разработке, так и для непрерывной интеграции, он выдаст вам ошибку в рабочей среде, если вы используете задачи пакета capistrano для развертывания или если вы используете bundle install --deployment опцию (которая рекомендуется в рабочей среде)

При использовании if RUBY_PLATFORM.downcase.include?("darwin") строки вы получите эту ошибку при развертывании.

 # bundle install --deployment --without development test
You are trying to install in deployment mode after changing
your Gemfile. Run `bundle install` elsewhere and add the
updated Gemfile.lock to version control.

You have deleted from the Gemfile:
* autotest-fsevent
* autotest-growl
  

Итак, мое окончательное решение этой проблемы — включить драгоценные камни для конкретной платформы в заданную группу, скажем, osx, а затем в рабочей среде и на сервере CI исключить их с помощью bundle.

Если вы используете capistrano для развертывания, поместите это в свой config.rb

 set :bundle_without,  [:development, :test, :osx]
# capistrano bundler task
require "bundler/capistrano"
  

Ответ №1:

Возможно, вам захочется использовать группы в вашем gemfile, что-то вроде:

 group :development do
  gem "autotest-growl"
  gem "autotest-fsevents"
end  

и на сервере, который вы используете: $ bundle install --without development

Комментарии:

1. Я использую эту конфигурацию на своем ci, и я хотел бы упростить ее, поэтому я хотел бы, чтобы мои шаги запуска на ci были такими же простыми, как bundle install; rake spec; rake cucumber .

2. Я много раз искал эту проблему, и на данный момент решения нет. Итак, я собираюсь принять ваш ответ как правильный.

Ответ №2:

Вы можете справиться с этим, воспользовавшись преимуществами различных сред Gemfile (тестирование, разработка, производство).

Ваш локальный блок может быть предназначен для разработки, в то время как сервер CI является вашей «производственной» средой.

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

Редактировать: Извините, мне кажется, я слишком быстро просмотрел ваш пост. Но вы можете добавить свой ~/.autotest в .gitignore , чтобы он не был включен на вашем сервере CI.

Комментарии:

1. ~/.autotest Файл не является проблемой, потому что он находится в моем домашнем каталоге, а не в корне проекта. Проблема в том, что для этого требуются два драгоценных камня, которых нет в Gemfile, поэтому в контексте пакета, требующего этих драгоценных камней, возникает ошибка загрузки. Я бы хотел избежать другого подхода (управление различными средами в Gemfile), чтобы избежать дублирования конфигурации между ними.

2. Хорошо, я лучше понимаю вашу проблему. Но вы хотите сказать, что вам не нравится идея иметь разные группы «тестирование, разработка, производство» в вашем Gemfile? Потому что именно для этого существуют эти группы; разные конфигурации для разных сред. Кроме того, дело в том, что ваш CI и сервер разработки сильно отличаются (linux и osx). Вместо того, чтобы беспокоиться об этом, я думаю, вам следует сосредоточиться на создании воспроизводимого способа правильной настройки вашего CI. И вы можете сделать именно это, написав свою собственную задачу rake.

3. Я согласен с тем, что вы говорите, единственное, чего я хотел бы избежать, это помещать зависящие от платформы самоцветы (autotest-growl) в общую среду (т. Е. разработку), потому что, если мне нужно запустить приложение на промежуточном сервере со средой разработки (чтобы показать демонстрацию или доказательство концепции), оно не будет работать в Linux.