草庐IT

c++ - 组织解决方案,项目和SVN

coder 2024-02-04 原文

在目录结构方面,我希望在SVN中建立项目时有所帮助。我已经在SO上阅读了有关此问题的几个答案,但是由于我是新来的,所以大多数答案很难理解。

我正在构建一个库,其他几个不同的项目都依赖于该库:

我需要能够轻松导出MyLibrary(仅 header 和.lib)以供第三方使用的功能

MyLibrary1

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

  • MyLibrary2
  • 取决于外部库fmod,glew,...

  • 项目1,2,4,5,6 ...
  • 取决于MyLibrary1、2或同时取决于
  • 每个项目可能需要多个平台(osx,windows等)的版本。

  • 我想知道一种组织这种情况的好方法,请记住,我对此还比较陌生-更加 Nerd 的答案会有所帮助。例如,如果您编写类似/src的内容,请解释一下其中应该包含的内容!我可以猜测,但我不确定=)

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

    //编辑

    我无法对此发表评论,所以去了:
    @ J.N,感谢您的广泛答复,我想澄清一些内容,希望我能正确理解您的意思:
    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
    

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

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

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

    最佳答案

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

    请记住,无论您做什么,您的项目最终都会增长到足以使其无法适应的程度。在项目生命周期中多次更改结构是正常的。您会感觉到这种情况不再正确了:通常是安装程序给您带来的困扰超过了它的帮助。

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

    没有每个项目的变体,您不会通过维护并行版本或分支来解决多个变体。对于每个可用于所有变体的项目/库,都有一个单个源树。不要管理不同的“操作系统”,而要管理不同的功能。也就是说,在“support posix sockets”或“support UI”之类的东西上有变体。这意味着如果有新的操作系统出现,那么您只需要选择它支持的功能集而不是启动新版本即可。

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

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

    有一个特定的“dependencies”文件夹,其中每个子文件夹都包含一个依赖项(包括include和sub依赖项)所需的所有内容。在开始时,如果代码库不是太大,那么您就不必太在乎自动确保所有依赖项相互兼容,并将其保存以备后用。

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

    不要尝试一次使用同一依赖项的多个版本。那将结局很糟。如果确实需要(但请尽量避免这样做),请为每个版本分支项目。

    3-维护不同的项目

    我建议独立维护每个项目存储库(使用SVN,它们仍然可以是相同的存储库,但位于单独的文件夹中)。分支和标记应特定于一个项目,而不是全部。尝试限制分支的最大数量,它们不能解决问题(即使使用git)。当您必须并行维护不同的编年史版本(而不是的变体)时,请使用分支,并在实际操作之前尽可能多地进行反击,每个人都将从使用新代码中受益。

    这将允许施加安全性限制(不确定是否可以使用Vanilla SVN,但是有一些免费的服务器可以支持它)。

    我建议每当有人在某个项目上提交给每个可能感兴趣的人时,就发送电子邮件通知。

    4-项目源代码树的组织

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

  • 行李箱(当前版本)
  • 分支(较旧的版本,仍在使用中)
  • 标签(发行版,用于创建分支,不需要补丁时会考虑太多)
    当项目变大时,将分支和标签组织在子文件夹中(例如,branchs/V1.0/V1.1和branchs/V2.0/V2.1)。

  • 有一个包含以下子文件夹的根文件夹:(其中某些文件夹可能是VC本身创建的)
  • 构建系统(makefile或其他文件所需的 Material )
  • 工具(如果有的话,例如XSLT工具或SOAP编译器,用于启动测试的脚本)
  • 数据(运行时需要测试的数据)
  • 输出(构建系统放置二进制文件的位置)
  • Temp输出(由编译创建的临时文件,可选)
  • 依赖关系
  • 文件(如果有的话;或生成的文档)
  • 版本(生成的归档文件请参阅下文)
  • 样本(一个演示如何使用项目/库的小项目)
  • 源代码(我不喜欢拆分 header 和.cpp,但这是我的方式)
  • 避免过多级别的子文件夹,很难搜索树,列表更容易
  • 正确定义每个文件夹的构建顺序(对于VC来说不是必需的,但是仍然如此)
  • 我使我的 namespace 与我的文件夹名称匹配(旧的Java习惯,但是可以使用)
  • 明确定义导出
  • 所需的“公共(public)”部分
  • 如果项目足够大,可以容纳多个二进制文件/dll,则每个文件都应具有自己的文件夹

  • 不要提交您生成的任何二进制文件,仅提交发行版。二进制文件喜欢彼此冲突,并给团队中的其他人造成痛苦。

    5-打包项目

    首先,请确保在文本文件中包含SVN修订版和日期,并且有一种自动方式来实现自动 Prop 。

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

    关于c++ - 组织解决方案,项目和SVN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9533700/

    有关c++ - 组织解决方案,项目和SVN的更多相关文章

    1. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

      如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

    2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

      我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

    3. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

      在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

    4. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

      我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

    5. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

      我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

    6. Ruby 从大范围中获取第 n 个项目 - 2

      假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit

    7. 屏幕录制为什么没声音?检查这2项,轻松解决 - 2

      相信很多人在录制视频的时候都会遇到各种各样的问题,比如录制的视频没有声音。屏幕录制为什么没声音?今天小编就和大家分享一下如何录制音画同步视频的具体操作方法。如果你有录制的视频没有声音,你可以试试这个方法。 一、检查是否打开电脑系统声音相信很多小伙伴在录制视频后会发现录制的视频没有声音,屏幕录制为什么没声音?如果当时没有打开音频录制,则录制好的视频是没有声音的。因此,建议在录制前进行检查。屏幕上没有声音,很可能是因为你的电脑系统的声音被禁止了。您只需打开电脑系统的声音,即可录制音频和图画同步视频。操作方法:步骤1:点击电脑屏幕右下侧的“小喇叭”图案,在上方的选项中,选择“声音”。 步骤2:在“声

    8. 【高数】用拉格朗日中值定理解决极限问题 - 2

      首先回顾一下拉格朗日定理的内容:函数f(x)是在闭区间[a,b]上连续、开区间(a,b)上可导的函数,那么至少存在一个,使得:通过这个表达式我们可以知道,f(x)是函数的主体,a和b可以看作是主体函数f(x)中所取的两个值。那么可以有,  也就意味着我们可以用来替换 这种替换可以用在求某些多项式差的极限中。方法: 外层函数f(x)是一致的,并且h(x)和g(x)是等价无穷小。此时,利用拉格朗日定理,将原式替换为 ,再进行求解,往往会省去复合函数求极限的很多麻烦。使用要注意:1.要先找到主体函数f(x),即外层函数必须相同。2.f(x)找到后,复合部分是等价无穷小。3.要满足作差的形式。如果是加

    9. ruby - 使用 `+=` 和 `send` 方法 - 2

      如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

    10. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

      深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

    随机推荐