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