Вот чему мы научились в Starling Software для QAM и QWeb.
Наш подход заключается в том, чтобы рассматривать это как работу по рефакторингу, которая распространяется на все проекты с использованием фреймворка или прото-фреймворка. Мы разделяем код фреймворка в каждом проекте на что-то, что создается отдельно, так что, например, src / myapp содержит специфичный для приложения код, а src / qam содержит сам фреймворк. Каждый проект имеет свою собственную копию кода приложения, а также есть отдельный проект, который содержит только последнюю версию самой платформы. Когда мы определяем что-то в рамках конкретного проекта, который хочет быть в рамках, мы:
- рефакторинг в рамках проекта для обобщения кода (на основе нашего понимания как этого приложения, так и всех остальных, использующих фреймворк);
- рефакторинг в рамках проекта для перемещения сгенерированного кода из специфичной для приложения части в часть инфраструктуры;
- применить это обновление к проекту, который содержит «главную копию» платформы;
- объединить изменения из этой мастер-копии с другими проектами, которые также используют платформу; а затем
- Рефакторинг в других проектах для использования этой части платформы, а не их аналогичного кода для конкретного приложения.
Это требует изрядной дисциплины для быстрого перемещения изменений. Если вы только что закончили разработку новой функции и сразу внедрили ее в другие проекты, интеграция проста. Проекты, которые не обновляются в течение некоторого времени, значительно усложняются, чтобы использовать последнюю версию фреймворка. Если вы не вносите изменения в основную копию быстро, вы можете столкнуться с различными (и, что еще хуже, конфликтующими) изменениями в каркасных копиях в двух проектах, и объединение может стать довольно трудной задачей. Вы определенно хотите обновить любой конкретный проект до последней версии фреймворка, прежде чем начинать изменять фреймворк.
Для этого требуется определенная практическая поддержка с точки зрения инструментов и так далее. Вы захотите легко и быстро перемещать изменения между различными копиями фреймворка. У нас есть специальный инструмент для этого (qu
), но я бы предположил, что для этого можно также использовать систему контроля версий, в частности распределенную, которая работает путем перемещения патчей.
Наличие комплексного набора тестов для каждого приложения очень помогает; Я не уверен, что хотел бы попробовать это без этого.
Для здравомыслия важно, чтобы изменения были небольшими. Опять же, все зависит от того, насколько сложно объединять и перемещать обновления. Если это всегда быстро и то, над чем вы работали совсем недавно, все будет просто. Чем больше изменений, и чем дольше вы работали над этим фрагментом фреймворка, тем сложнее становится.