我的印象是这个问题被问了一百次,但从未完全回答过。
我正在做一个小项目,在某个时候应该针对三大 PC 平台(Windows、Mac 和 GNU/Linux)发布,所以过早地锁定技术不是一个好主意。幸运但也不幸的是,目前,在早期开发期间,我们只针对 32 位 Windows。
在代码层面上,如果您选择了正确的库,跨平台开发相对容易。在多个平台上构建软件也相对简单,我正在考虑使用 GYP 或 CMake。
问题是依赖关系。要构建项目,您需要:SDL、SDL_image、SDL_ttf、iconv、libxml2、libxmlmm、sigc++、wxWidgets、glew、bullet、openALsoft 以及稍后可能添加的更多内容。
到目前为止,我找到了三个选项:
第一个似乎有点矫枉过正,因为您基本上需要维护库的分支和自定义构建系统。
第二个选项听起来像是您只针对一个或两个平台时应该做的事情。但是,如果您计算所有不同的目标,包括 32/64 位变体,这也会开始膨胀到几乎无法控制的程度。
第三个选项取决于环境。如果您让您的开发人员手动处理依赖项,您将永远无法休眠。仅仅构建每个依赖项并准备好使用几乎是不可能的。更不用说您无法确保每个开发人员都使用正确的版本。
如果你看看其他语言,它们解决问题的方式不同。使用 npm、marvin 或 phing 等系统,您只需在项目中维护一些配置文件,然后工具即可获取所需的任何依赖项。
我正在考虑集中构建依赖项,将它们打包成 zip/deb/rpm/whatever 包并将它们放入存储库中。然后每个开发人员都会在构建之前将其平台的依赖项复制到存储库中(但不 checkin )。这最好作为预构建步骤自动完成。
我特别不想要额外的构建系统。我环顾四周,唯一可以远程执行我想要的操作的可能是 Ivy。但要么是遗漏了什么,要么是 Ivy 完全过度设计了这个问题。是否存在解决此问题的简单方法?
我正在努力打造自己的。
最佳答案
我建议不要自己构建。
我们使用 ant/ivy/Hudson 来自动化我们的跨平台(Windows 和 Linux)构建。我们还使用 Nexus (Maven) 作为我们的工件存储库,其中包含我们的第 3 方库的平台特定构建以及我们自己的应用程序。 Hudson 与 Perforce(我们的软件存储库)完美集成。
我们还在为所有内容创建单独的 32 位和 64 位工件,而 ant/ivy 将使这一切变得更加容易。
这对我们来说效果很好。
关于c++ - 处理 C++ 依赖项(跨平台),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16338072/
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
如何将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.你能做的最好的事情是:
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
我对图像处理完全陌生。我对JPEG内部是什么以及它是如何工作一无所知。我想知道,是否可以在某处找到执行以下简单操作的ruby代码:打开jpeg文件。遍历每个像素并将其颜色设置为fx绿色。将结果写入另一个文件。我对如何使用ruby-vips库实现这一点特别感兴趣https://github.com/ender672/ruby-vips我的目标-学习如何使用ruby-vips执行基本的图像处理操作(Gamma校正、亮度、色调……)任何指向比“helloworld”更复杂的工作示例的链接——比如ruby-vips的github页面上的链接,我们将不胜感激!如果有ruby-
有什么方法可以告诉sidekiq一项工作依赖于另一项工作,并且在后者完成之前无法开始? 最佳答案 仅使用Sidekiq;答案是否定的。正如DickieBoy所建议的那样,您应该能够在依赖作业完成时将其启动。像这样。#app/workers/hard_worker.rbclassHardWorkerincludeSidekiq::Workerdefperform()puts'Doinghardwork'LazyWorker.perform_async()endend#app/workers/lazy_worker.rbclassLaz
我有一个super简单的脚本,它几乎包含了FayeWebSocketGitHub页面上用于处理关闭连接的内容:ws=Faye::WebSocket::Client.new(url,nil,:headers=>headers)ws.on:opendo|event|p[:open]#sendpingcommand#sendtestcommand#ws.send({command:'test'}.to_json)endws.on:messagedo|event|#hereistheentrypointfordatacomingfromtheserver.pJSON.parse(event.d
我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“