在目录结构方面,我希望在SVN中建立项目时有所帮助。我已经在SO上阅读了有关此问题的几个答案,但是由于我是新来的,所以大多数答案很难理解。
我正在构建一个库,其他几个不同的项目都依赖于该库:
我需要能够轻松导出MyLibrary(仅 header 和.lib)以供第三方使用的功能
MyLibrary1
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-维护每个项目的不同变体
没有每个项目的变体,您不会通过维护并行版本或分支来解决多个变体。对于每个可用于所有变体的项目/库,都有一个单个源树。不要管理不同的“操作系统”,而要管理不同的功能。也就是说,在“support posix sockets”或“support UI”之类的东西上有变体。这意味着如果有新的操作系统出现,那么您只需要选择它支持的功能集而不是启动新版本即可。
当需要特定的代码时,创建一个接口(interface)(C++中的抽象类),并实现与其有关的行为。这将隔离有问题的代码,并有助于将来添加新的变体。使用宏在编译时选择合适的宏。
2-维护每个项目的依赖关系
有一个特定的“dependencies”文件夹,其中每个子文件夹都包含一个依赖项(包括include和sub依赖项)所需的所有内容。在开始时,如果代码库不是太大,那么您就不必太在乎自动确保所有依赖项相互兼容,并将其保存以备后用。
不要尝试从svn层次中较高的根位置合并依赖项。将每个新版本正式交付给需要它的团队,由他们决定使用它来更新他们自己的SVN部分。
不要尝试一次使用同一依赖项的多个版本。那将结局很糟。如果确实需要(但请尽量避免这样做),请为每个版本分支项目。
3-维护不同的项目
我建议独立维护每个项目存储库(使用SVN,它们仍然可以是相同的存储库,但位于单独的文件夹中)。分支和标记应特定于一个项目,而不是全部。尝试限制分支的最大数量,它们不能解决问题(即使使用git)。当您必须并行维护不同的编年史版本(而不是的变体)时,请使用分支,并在实际操作之前尽可能多地进行反击,每个人都将从使用新代码中受益。
这将允许施加安全性限制(不确定是否可以使用Vanilla SVN,但是有一些免费的服务器可以支持它)。
我建议每当有人在某个项目上提交给每个可能感兴趣的人时,就发送电子邮件通知。
4-项目源代码树的组织
每个项目应具有以下SVN结构:
关于c++ - 组织解决方案,项目和SVN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9533700/
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
在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',
我在我的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服务器更新战俘
我已经像这样安装了一个新的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="
假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit
相信很多人在录制视频的时候都会遇到各种各样的问题,比如录制的视频没有声音。屏幕录制为什么没声音?今天小编就和大家分享一下如何录制音画同步视频的具体操作方法。如果你有录制的视频没有声音,你可以试试这个方法。 一、检查是否打开电脑系统声音相信很多小伙伴在录制视频后会发现录制的视频没有声音,屏幕录制为什么没声音?如果当时没有打开音频录制,则录制好的视频是没有声音的。因此,建议在录制前进行检查。屏幕上没有声音,很可能是因为你的电脑系统的声音被禁止了。您只需打开电脑系统的声音,即可录制音频和图画同步视频。操作方法:步骤1:点击电脑屏幕右下侧的“小喇叭”图案,在上方的选项中,选择“声音”。 步骤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.要满足作差的形式。如果是加
如何将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.你能做的最好的事情是:
深度学习部署: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