Одновременное ведение проектов на нескольких платформах?
Здравствуйте. Хотел спросить, есть ли в сообществе люди, которые разрабатывают проект одновременно для нескольких платформ (в данном случае я имею в виду .Net в классическом исполнении, версия роли не играет, и Mono, плюс Mono for Android). Возник вопрос такого рода: как правильно организовать солюшен (Solution), чтобы держать в нем библиотеки для всех платформ. Пример — пишем библиотеку классов (Class library), которая должна использоваться на всех платформах. Но, например, на Mono for android не поддерживается SoapFormatter, поэтому из класса для этой платформы надо исключить участки кода, отвечающие за работу с Soap. При этом, выходит, для каждой платформы надо создавать отдельно эту библиотеку с одинаковым названием (три штуки), делать копии всех файлов с исходным кодом (скажем, в библиотеке их 10 штук, суммарно выходит 30), следить за тем, чтобы вносить правки в код ВСЕХ библиотек для всех платформ после правки только в одной из них… Выходит несколько утомительно, если проектов много.
Может быть, есть определенная методология, описывающая как правильно работать в таких случаях, как грамотно организовать такую работу, следить за корректностью кода для всех платформ и т.п. Или кто-нибудь поделится своим опытом?
Не самый удобный вариант. Меня больше интересует вопрос, как работать одновременно с несколькими копиями исходников, ведь не получится же использовать одновременно один и тот же файл для разных проектов.
Просто делать под самую ограниченную версию все равно придется )
Если она и в функционале ограничена — то можно системой плагинов добавлять нужный функционал, где это надо.
На счет организации работы. Можно на основе веток в CVS разделить версии.
1. Все платформо-зависимое вынести в отдельный модуль.
2. Организовать ветки в CVS (я бы выбрал Hg, но git подойдет не хуже), где для каждой платформы своя ветка (с явно выделенной основной веткой).
3. Делая правки в основной ветке, слиянием с другой они прозрачно переносятся в нее.
4. Соответственно, в каждой персональной ветке используется свой, платформо-зависимый плагин. Изменения в таком плагине не пройдут слияния между ветками, но общие части — запросто.
Для сборки под разные платформы или версии можно написать задание для систем сборки (и затем запускать их, к примеру 'Ant was' — сборка под IBM WebSphere, или 'Ant tomcat' — сборка для Apache Tomcat).
Чтобы проверить работу кода под разные платформы, исправление ошибок для разных поддерживаемых версий — пишите unit тесты, которые воспроизводят ошибку в коде, либо интеграционный тест для более сложных ошибок. Соответственно если поправили ошибку только на одну платформу, то автотесты провалятся под другой платформой.
Еще можно ставить хаки на систему контроля версий, которые не будут пропускать коммиты с комментарием # в текущую ветку, пока не будут закрыты ошибки на других сопровождаемых ветках (хотя этот вариант мне не нравится, он использовался в некоторых компаниях, где я работал).