组织解决方案,项目和SVN

aCu*_*ria 6 c++ svn project-organization visual-c++

我想在SVN中建立一个关于目录结构的项目.我已经在SO上阅读了几个关于此问题的答案,但由于我是新手,所以大多数都很难理解.

我正在构建一个单独的库,其他几个不同的项目取决于:

我需要能够轻松导出MyLibrary(仅限标题和.lib)供第三方使用

MyLibrary1

  • 取决于外部库,应该能够管理这些库的不同版本!

MyLibrary2

  • 取决于外部图书馆fmod,glew,...

项目1,2,4,5,6 ......

  • 取决于MyLibrary1,2或两者
  • 每个项目都需要多个平台的版本(osx,windows ......)

我想知道一个很好的方法来组织这个,请记住我对这个很陌生 - 一个更迂腐的答案会有所帮助.例如,如果您编写类似/ src的内容,请解释应该进入的内容!我可以猜到,但我不确定=)

////////////////////////////////////////////////// ////////////////////////////////////////////////// ////////

//编辑

我不能把它写成评论,所以这里说:@JN,感谢广泛的回复,我想澄清一些内容,我希望我理解你的意思:

root
    library foo
        /branches           // old versions of foo
        /tags               // releases of foo
        /trunk              // current version
            /build          // stuff required by makefiles
            /tools          // scripts to launch tests ect
            /data           // test data needed when running
            /output         // binaries, .exe files
            /dependencies   // libraries that foo needs
                /lib name
                    include
                    lib
            /docs           // documentation
            /releases       // generated archives
            /sample         // sample project that shows how to use foo
            /source         // *.h, *.cpp

    program bar
        /branches           // old versions of bar
        /tags               // releases of bar
        /trunk              // current version
            /build          // stuff required by makefiles
            /tools          // scripts to launch tests ect
            /data           // test data needed when running
            /output         // binaries, .exe files
            /dependencies   // libraries that bar needs
                /lib name
                    include
                    lib
            /docs           // documentation
            /releases       // generated archives
            /sample         // sample project that shows how to use bar
            /source         // *.h, *.cpp
Run Code Online (Sandbox Code Playgroud)

1)*.sln文件在哪里?在/ build?

2)我需要将foo/source复制到bar/dependencies/foo/include吗?毕竟,酒吧取决于foo

3)*.dll文件在哪里?如果foo依赖于dll文件,那么使用foo的所有程序都需要访问相同的dll文件.它应该进入root/dll吗?

J.N*_*.N. 5

您的问题有几个层次:如何组织单个项目源代码树,如何将不同项目一起维护,如何维护这些项目的依赖关系,如何维护每个项目的不同变体以及如何打包它们.

请记住,无论你做什么,你的项目最终会变得足够大,以使其不适应.在项目的生命周期中多次更改结构是正常的.当这种情况发生时,你会感觉它不再正常:通常当设置困扰你时,通常会比它更有帮助.


1 - 维护每个项目的不同变体

没有每个项目的变体,您不会通过维护parralel版本或分支来解决几个变体.有一个单一的每个项目/库,可用于所有变种的源代码树.不管理不同的"操作系统",管理不同的功能.也就是说,有"支持posix套接字"或"支持UI"之类的变体.这意味着如果出现新操作系统,那么您只需选择它支持的功能集,而不是启动新版本.

当需要特定代码时,创建一个接口(C++中的抽象类),并实现与之相关的行为.这将隔离有问题的代码,并将有助于在未来添加新的变体.使用宏在编译时选择合适的宏.


2 - 维护每个项目的依赖关系

有一个特定的"dependencies"文件夹,其中每个子文件夹包含一个依赖项所需的所有内容(包括和子依赖项).在代码库不太大的情况下,您不必太在意自动确保所有依赖项彼此兼容,将其保存以供日后使用.

不要尝试合并svn层次结构中较高根位置的依赖项.正式将每个新版本交付给需要它的团队,由他们自己更新自己的SVN部分.

不要尝试一次使用同一依赖项的多个版本.那会很糟糕.如果你真的需要(但尽量避免使用它),请为每个版本分支项目.


3 - 维护不同的项目

我建议独立维护每个项目存储库(使用SVN它们仍然可以是相同的存储库,但在单独的文件夹中).分支和标签应该特定于一个项目,而不是所有项目.尽量限制分支的最大数量,它们不能解决问题(即使使用git).当你必须并行维护不同的chronoligical版本(而不是变体)并在实际执行之前尽可能地反击时使用分支,每个人都将受益于使用更新的代码.

这将允许施加安全限制(如果可行的话,不能确定使用vanilla SVN,但有一些免费提供的服务器支持它).

我建议每当有人向项目的每个人提交项目时,都会发送电子邮件通知.


4 - 项目源树组织

每个项目都应具有以下SVN结构:

  • 主干(当前版本)
  • 分支机构(旧版本,仍在使用中)
  • 标签(发布,用于在需要补丁时不必过多考虑创建分支)当项目变大时,在子文件夹中组织分支和标记(例如branches/V1.0/V1.1和branches/V2.0/V2 0.1).

拥有包含以下子文件夹的根文件夹:(其中一些可能由VC本身创建)

  • 构建系统(makefile或其他所需的东西)
  • 工具(如果有的话,如XSLT工具或SOAP编译器,用于启动测试的脚本)
  • 数据(运行时需要的测试数据)
  • 输出(构建系统放置二进制文件的位置)
  • 临时输出(由编译创建的临时文件,可选)
  • 依赖
  • 文档(如果有的话)或生成的文档)
  • 发布(生成的档案见后)
  • 示例(演示如何使用项目/库的小项目)
  • 来源(我不喜欢拆分标题和.cpp,但这是我的方式)
    • 避免使用太多级别的子文件夹,搜索树很难,列表更容易
    • 正确定义每个文件夹的构建顺序(VC不太必要,但仍然)
    • 我使我的命名空间匹配我的文件夹名称(旧的Java习惯,但工作)
    • 清楚地定义您需要导出的"公共"部分
    • 如果项目足够大以容纳多个二进制文件/ dll,则每个文件都应该有自己的文件夹

不要提交您生成的任何二进制文件,只提交版本.二进制文件喜欢互相冲突,给团队中的其他人带来痛苦.


5 - 打包项目

首先,确保包含带有SVN修订版和日期的文本文件,有一种自动方式可以使用自动道具.

您应该有一个脚本来生成版本(如果时间允许).它将检查所有内容是否已提交,生成新版本号....创建一个zip/tar.gz存档,您必须提交/存档,其名称包含SVN修订版,分支和当前日期(格式应该规范化)项目).存档应该具有运行应用程序所需的一切/在文件结构中使用库.创建一个标记,以便您可以从它开始进行紧急错误修复.