组织项目文件有两种主要惯例,以及许多变体。
惯例1:高层次的类型目录,项目子目录
例如,wxWidgets 项目采用这种风格:
/solution
/bin
/prj1
/prj2
/include
/prj1
/prj2
/lib
/prj1
/prj2
/src
/prj1
/prj2
/test
/prj1
/prj2
优点:
- 如果项目有依赖项,它们可以从单个文件中管理
- 扁平的构建文件结构
缺点:
- 由于测试有其自己的头文件和cpp文件,当你为EXE文件而不是库生成单元测试应用程序时,它们需要包含来自你正在测试的应用程序的目标文件。这要求您创建推理规则并展开所有源文件的相对路径。
- 在另一个解决方案中重用任何项目都需要从树形结构中提取出正确的文件并修改任何构建脚本
惯例2:高级项目目录,类型子目录
例如,Wireshark 项目使用此风格
/solution
/prj1
/bin
/include
/lib
/src
/test
/prj2
/bin
/include
/lib
/src
/test
优点:
- 项目本身被封装在文件夹中,易于移动和重用
- 构建工具中的推理规则变短
- 有助于建立分层式的构建脚本
缺点:
- 如果项目之间存在依赖关系,则需要在项目目录之上添加另一层构建脚本来管理构建顺序。
我们目前正在使用方法1进行项目开发,效果不错。现在,我正在添加单元测试(通过CxxTest实现)以及使用nmake实现持续集成,但方法1在创建适当的nmake文件时会遇到一些严重问题。
我的主要需求/目标是:
降低整个解决方案构建脚本的维护工作量。
将解决方案中的项目及其构建步骤与其他项目分离。
通过使用构建脚本从检出到发布媒体生成为每个提交实现持续集成(显然还利用其他工具如CruiseControl等)。
为开发者尽可能地简化添加或删除其他项目或源文件的过程,同时减少错误。
因此我问:
- 这两种方法是否还有其他优缺点?
- 有没有明确的论点支持仅采用其中一种约定?