Кажется, существуют два основных соглашения для организации файлов проекта, а затем для многих вариантов.
Конвенция 1: Каталоги высокого уровня, суб-каталоги проектов
Например, проект wxWidgets использует этот стиль:
/solution
/bin
/prj1
/prj2
/include
/prj1
/prj2
/lib
/prj1
/prj2
/src
/prj1
/prj2
/test
/prj1
/prj2
Плюсы:
- Если существуют зависимости проекта, их можно управлять из одного файла
- Структура плоской сборки
Минусы:
- Поскольку у теста есть свои собственные файлы заголовков и cpp, при создании unit test приложений для EXE файлов, а не библиотек, они должны включать объект файлов из тестируемого приложения. Это требует от вас создания правил вывода и расширения относительных путей для всех исходных файлов.
- Повторное использование любого из проектов в другом решении требует, чтобы вы извлекали правильные файлы из древовидной структуры и изменяли любые скрипты сборки
Конвенция 2: Каталог проектов высокого уровня, подкаталоги типов
Например, проект Wireshark использует этот стиль
/solution
/prj1
/bin
/include
/lib
/src
/test
/prj2
/bin
/include
/lib
/src
/test
Плюсы:
- Проекты сами по себе автономны в своих папках, что облегчает их перемещение и повторное использование.
- Позволяет использовать более короткие правила вывода в инструментах построения.
- Облегчает скрипты иерархической сборки
Минусы:
- Если существуют зависимости между проектами, вам нужен дополнительный уровень скриптов сборки над каталогами проектов для управления порядком сборки
В настоящее время мы используем соглашение 1 по нашему проекту, и до сих пор он работал достаточно хорошо. Теперь я в процессе добавления модульного тестирования (через CxxTest) и облегчения перехода к непрерывной интеграции с помощью nmake, соглашение 1 вызывает некоторые серьезные головные боли при создании соответствующих файлов nmake.
Мои основные требования/цели:
-
Уменьшите уровень усилий для поддержки скриптов сборки всего решения.
-
Де-пара проектов и их шаги сборки в рамках решения других проектов.
-
Облегчайте непрерывную интеграцию с помощью скриптов сборки для регистрации, чтобы освободить создание мультимедиа для каждой фиксации (очевидно, используя другие инструменты, такие как CruiseControl).
-
Сделать добавление или удаление дополнительных проектов или исходных файлов максимально простым и максимально подверженным ошибкам для разработчиков.
Поэтому я спрашиваю:
- Есть ли другие плюсы и минусы любой из этих методов?
- Есть ли четкий способ, который способствует только одному из этих конвенций?