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

Совлокальные модели между двумя приложениями Rails - что является идеальным решением для Workflow?

В настоящее время я работаю над проектом Rails 3, который делится на четыре части:

  • Публичный сайт
  • Веб-сайт администрации/бэкэнд
  • Модели
  • API для доступа к сторонним данным

Поскольку модели разделяются между тремя ключевыми компонентами, я хочу, чтобы они не были в одном основном проекте, однако каждая часть нуждается в доступе к моделям, но я не хочу повторять код и иметь разные версии везде.

В настоящее время у меня есть код модели в драгоценном камне, и в каждом проекте Gemfile я ссылаюсь на них со следующей строкой:

gem "my_models", :path => "../my_models/"

Однако, когда я развертываю на наших тестовых серверах для своих сотрудников, чтобы оценить систему, мне нужно вывести модели из внешнего репозитория, поэтому я поменяю приведенную выше строку следующим образом:

gem "my_models", :git => "[email protected]:username/my_models.git"

Это само по себе работает хорошо, но его довольно неуклюжий в терминах "версий" (т.е. мне нужно, чтобы каждый раз, когда я планирую развернуть изменения на тестовых серверах, нужно набросать версию), переключите линию на использование git вместо локального и убедитесь, что я правильно нажимаю файлы.

Раньше я использовал общий подмодуль git, но это было так же неудобно.

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

Что бы люди там предложили, когда дело доходит до чего-то подобного? Или, я об этом не ошибаюсь?

Дополнительная информация:

Это приложение представляет собой переписку с существующим веб-сайтом, который следил за моделью "все в одном проекте" - к сожалению, здесь есть две проблемы:

  • Приложение было плохо развито - я унаследовал этот проект, и когда я впервые взял его, время загрузки составляло ~ 2 минуты на страницу с одним пользователем - это с тех пор было уменьшено, но все еще имеет проблемы во всех
  • В настоящее время мы находимся на пределе емкости текущего сайта, и мы ожидаем, что в ближайшие 6 месяцев нам потребуется больше нагрузки. Однако масштабирование с помощью приложения "все в одном" означает, что мы будем тратить ресурсы при масштабировании заднего конца сайта, который не нуждается в нем.

По сути, есть две вещи, которые я хочу разделить: передняя часть (являющаяся публичным веб-сайтом и API) и задним концом - все, что я знаю о разработке программного обеспечения, говорит мне, что объединение всего этого не является идеальным решением (и прошлая история показывает мне, что разделение этих двух является хорошим шагом с точки зрения обеспечения производительности переднего конца).

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

4b9b3361

Ответ 1

отбросьте проект модели (поместите модели в одну из других частей, я предлагаю все, что вы считаете "более важным" ), поместите все проекты в один репозиторий (отдельные папки проекта) и сделайте символические ссылки на модели/libs/apis/независимо

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

одна хорошая вещь о настройке single-repo-symlink заключается в том, что ваши коммиты будут менее фрагментированы и обычно будут представлять собой полнофункциональную реализацию - легче отслеживать ошибки, читать историю и поддерживать код.

Кроме того, при развертывании вам не нужно читать из многих репозиториев - одна минута ошибки прямо там

процесс выпуска также проще с такой моделью, как ветвь теперь будет обладать областью всех проектов

есть некоторые недостатки, такие как symlinks, которые не работают так хорошо на окнах и еще что-то, но для меня он отлично работает

Ответ 2

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

Подробнее см. railscast.

Ответ 3

Вам все равно придется управлять "версиями", нажимая изменения, которые необходимо протестировать на удаленное репо, но вы можете использовать новую конфигурацию local Bundler 1.2

http://gembundler.com/man/bundle-config.1.html#LOCAL-GIT-REPOS

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

Ответ 4

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

Ответ 5

У вашего проекта достаточно покрытия кода? Если это так, я попытаюсь отделить логику там, где это имеет смысл, и если модель используется в разных проектах, просто выберите тот, который подходит лучше всего, и напишите API поверх этого.

Затем вы можете использовать этот API для доступа к этим моделям (предпочтительно используя что-то вроде ActiveModel) в другом проекте. У вас все равно будет простой CRUD, но вся логика базовой модели будет обрабатываться извне.

Не забудьте хорошо подумать, прежде чем раскалывать их. Вы хотите, чтобы ваш домен был тесно связан с каждым созданным вами приложением из Behemoth, которого вы хотите разорвать.

Относительно двигателей:

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

Ответ 6

Посмотрите на поддерево Git.

Это может сработать для вас.

http://igor-alexandrov.github.io/blog/2013/03/28/using-git-subtree-to-share-code-between-rails-applications/

ИЛИ

Вы можете написать задачу Rake.

Пример: -

namespace :sync do

  desc 'Copy common models and tests from Master'
  task :copy do
   source_path = '/home/project/src-path'
   dest_path = '/home/project/dest-path'

   # Copy all models & tests
   %x{cp #{source_path}/app/models/*.rb #{dest_path}/app/models/}
   %x{cp #{source_path}/spec/models/*_spec.rb #{dest_path}/spec/models/}

   # Database YML
   %x{cp #{source_path}/config/database.yml #{dest_path}/config/database.yml}

end

См. приведенную ниже ссылку.

http://hiltmon.com/blog/2013/10/14/rails-tricks-sharing-the-model/