我正在尝试进入 CI 的思维模式,这个周末一直在玩 Phing。一切看起来都很简单,可以使用,并且已经有很多示例。
然而,仍然让我感到困惑的是人们实际使用它的方式。也就是说,我不是在寻找您进行的测试,而是在寻找使用 Phing 的建议工作流程,您在哪个阶段激活它,在开发周期的哪个阶段采取行动。
例如,我们有几个网站,目前我们在本地编辑源代码并保存上传到实时站点(我知道这有多糟糕......),我们进行一些快速测试并确保代码按计划工作.如果是这样,我们 promise repo 并继续。如果没有,我们可以回滚或编辑撤消并重新保存。虽然这现在看起来很疯狂,但简单性对我们来说效果很好。
但是我们现在有一个小团队,所以我试图将 Phing 插入这个过程,以获得 linting/sniffing/mess detecting 等的所有额外好处。但是我想不出最好的事件顺序。
你会建议:
上面的内容对我来说似乎有点啰嗦。是不是因为看起来我正在尝试将测试部署与实时部署合并,这让我感到困惑?
另外,提交似乎有点倒退,然后运行 Phing,然后必须编辑并可能重新提交,然后再试一次。
因此,这样做是否更有意义:
上面的问题是,假设我只是想更正硬编码到 HTML 页面中的单词的拼写,这似乎有点过分了?
最后,人们如何设置他们的服务器,您是否有一台服务器用于实时站点,一台用于暂存站点,另一台用于托管 Phing(以及任何 CI 软件)?
最佳答案
像 Phing 这样的工具的重点是自动化。所以,要回答这个“你在哪个阶段激活它,它在开发周期的哪个阶段起作用”,我会说你应该在你觉得你会获得 yield 时尽快引入它 benefit从使用它。
例如,如果您有一个需要多个命令才能完成的流程,那么使用 Phing(或什至只是一个 shell 脚本)来自动执行这些步骤会有好处,尤其是当不止一个人需要执行这些操作时它或者它特别容易出错。
因此,您应该使用 phing 让您的生活更轻松,而不是更艰难。任何涉及多个 shell 命令的任务,或者总是涉及键入带有大量难以记住的参数的相同命令的任务,通常您可以/应该使用 phing 来自动化。
考虑到您提到的第一个步骤列表,它确实有点冗长。相反,您应该更早地使用 phing 来自动执行以下步骤:
所以基本上我会按照您在第二个列表中的建议进行操作。
您可能应该为单独的步骤制作 phing 命令,并制作用于运行的 phing 命令 一次运行一起运行的命令(例如,测试然后部署)。
如果您觉得有必要,这将允许您跳过阶段,例如在您给出的仅更改一些文本的示例中。
服务器的典型方法是将实时站点放在自己的服务器上,然后让登台/测试服务器尽可能地对其进行镜像。对于 CI 或其他实用程序,您通常可以将它们托管在登台服务器上,证明它们不会干扰您正在开发的主应用程序。
关于php - 好的 Phing 工作流程是什么样的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7786735/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳
它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput
我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串