【发布时间】:2010-09-20 22:33:58
【问题描述】:
组织项目文件似乎有两个主要约定,然后是许多变体。
约定1:高级类型目录、项目子目录
例如,wxWidgets 项目使用这种样式:
/solution
/bin
/prj1
/prj2
/include
/prj1
/prj2
/lib
/prj1
/prj2
/src
/prj1
/prj2
/test
/prj1
/prj2
优点:
- 如果有项目依赖项,可以从单个文件进行管理
- 平面构建文件结构
缺点:
- 由于 test 有自己的头文件和 cpp 文件,当您为 EXE 文件而不是库生成单元测试应用程序时,它们需要包含来自您正在测试的应用程序的 object files。这需要您创建推理规则并扩展所有源文件的相对路径。
- 在另一个解决方案中重用任何项目需要您从树结构中提取正确的文件并修改任何构建脚本
约定 2:高级项目目录,键入子目录
例如,Wireshark 项目使用这种样式
/solution
/prj1
/bin
/include
/lib
/src
/test
/prj2
/bin
/include
/lib
/src
/test
优点:
- 项目本身在其文件夹中是独立的,便于移动和重复使用
- 允许在构建工具中使用更短的推理规则
- 促进分层构建脚本
缺点:
- 如果项目之间存在依赖关系,则需要在项目目录之上额外增加一层构建脚本来管理构建顺序
我们目前在我们的项目中使用约定 1,到目前为止它运行良好。现在,我正在添加单元测试(通过 CxxTest)并使用nmake 促进向持续集成的迁移,约定 1 在创建正确的 nmake 文件时引起了一些严重的麻烦。
我的主要要求/目标是:
减少维护整个解决方案的构建脚本的工作量。
将解决方案中的项目及其构建步骤与其他项目分离。
通过使用构建脚本进行签出以为每次提交发布媒体生成(显然也利用 CruiseControl 等其他工具),从而促进持续集成。
使添加或删除其他项目或源文件对开发人员来说尽可能简单且不易出错。
所以我问:
- 还有其他优缺点吗 这些方法中的任何一种?
- 是否有明确的规定只偏爱一个 这些约定?
【问题讨论】:
-
我删除了关于使用 Lakos's Book 的原始答案,因为它实际上并没有回答这个问题。我仍然推荐这本书:Large Scale C++ Software Design。
-
谢谢,它已经在我的亚马逊阅读愿望清单上=]
标签: build-automation project-organization nmake