组织项目文件似乎有两个主要约定,然后是许多变体。
约定一:高级类型目录、项目子目录
例如,wxWidgets项目使用这种风格:
/solution
/bin
/prj1
/prj2
/include
/prj1
/prj2
/lib
/prj1
/prj2
/src
/prj1
/prj2
/test
/prj1
/prj2
优点:
- 如果存在项目依赖项,则可以从单个文件进行管理
- 平面构建文件结构
缺点:
- 由于 test 有自己的头文件和 cpp 文件,当您为 EXE 文件而不是库生成单元测试应用程序时,它们需要包含您正在测试的应用程序中的目标文件。这需要您创建推理规则并扩展所有源文件的相对路径。
- 在另一个解决方案中重用任何项目需要您从树结构中提取正确的文件并修改任何构建脚本
约定2:高级项目目录,类型子目录
例如,Wireshark项目使用这种风格
/solution
/prj1
/bin
/include
/lib
/src
/test
/prj2
/bin
/include
/lib
/src
/test
优点:
- 项目本身在其文件夹中是独立的,使它们更易于移动和重用
- 允许在构建工具中使用更短的推理规则
- 促进分层构建脚本
缺点:
- 如果项目之间存在依赖关系,则需要在项目目录之上额外增加一层构建脚本来管理构建顺序
我们目前在我们的项目中使用约定 1,到目前为止它运行良好。现在,我正在添加单元测试(通过 CxxTest)并促进使用nmake迁移到持续集成,约定 1 在创建正确的 nmake 文件时引起了一些严重的麻烦。
我的主要要求/目标是:
减少维护整个解决方案的构建脚本的工作量。
将解决方案中的项目及其构建步骤与其他项目分离。
通过使用用于签出的构建脚本来促进持续集成,以发布每次提交的媒体生成(显然也利用其他工具,例如 CruiseControl)。
使添加或删除其他项目或源文件对开发人员来说尽可能容易且不易出错。
所以我问:
- 这两种方法还有其他优点和缺点吗?
- 是否有明确的规定只支持其中一种约定?