Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Svn 如何管理CFC';s(子系统)即';在多个站点上共享?_Svn_Coldfusion_Cfc_Subsystem - Fatal编程技术网

Svn 如何管理CFC';s(子系统)即';在多个站点上共享?

Svn 如何管理CFC';s(子系统)即';在多个站点上共享?,svn,coldfusion,cfc,subsystem,Svn,Coldfusion,Cfc,Subsystem,你怎么能处理这样的事情?我尽了最大努力将子系统设计为可重用的,但只有一些网站特有的东西需要定制(例如帐户实体中的字段,或orm注释中的cfc=“”) 我曾想过使用SVN和分支定制,但我们发现它非常麻烦,因为提交人每次都必须确定一个增强/错误修复属于卡车或分支,一旦遗漏了什么,就不容易撤消 所以。。。处理这种情况的最好方法是什么?只需将代码集克隆到一个新的源代码管理中,并修复两个/所有源代码管理上的错误?我觉得您试图在两个站点之间重用代码,但代码之间存在细微的差异。我知道这听起来是说起来容易做起来

你怎么能处理这样的事情?我尽了最大努力将子系统设计为可重用的,但只有一些网站特有的东西需要定制(例如帐户实体中的字段,或orm注释中的cfc=“”)

我曾想过使用SVN和分支定制,但我们发现它非常麻烦,因为提交人每次都必须确定一个增强/错误修复属于卡车或分支,一旦遗漏了什么,就不容易撤消


所以。。。处理这种情况的最好方法是什么?只需将代码集克隆到一个新的源代码管理中,并修复两个/所有源代码管理上的错误?

我觉得您试图在两个站点之间重用代码,但代码之间存在细微的差异。我知道这听起来是说起来容易做起来难,但我认为你必须把不同点分开。因此,如果只有
账户
CFC需要更改,则维护两个版本,每个站点一个版本

然后可以设置一些CF映射。然后,您可以在
com.common.model
下为这两个站点创建一组CFC,在
com.mysite.model
下创建另一组CFC,在
com.myothersite.model
下创建另一组CFC

这样,您就避免了模型层中特定于站点的条件逻辑——这将很快变成一团乱麻


希望有帮助

假设您没有使用某种MVC框架。。。然而

我用了几种不同的方法来处理这种情况

根据CFC之间的差异和相同之处,您可以:

1) 使用继承 如果您的大多数代码都是相同的,但每个项目都只有一些差异,那么请将公共代码重构为一个基础CFC,并为每个项目进行扩展。这允许您为大多数功能维护一组单独的测试,然后只需为每个项目偏离的代码添加进一步的测试

这样做的缺点是,在修改基类时,它需要一些计划和规程来维护前向兼容性。本质上,您是在定义一个API,做好这一点并不容易

2) 使用混搭 如果您每次似乎重复的是功能/逻辑,那么请尝试将该逻辑重构为代码块,并将其包含到任何需要它的cfc中。见和

遗憾的是,与Ruby的模块不同,在CF中实现这一点的机制很弱


如果您的需求与您在评论中描述的一样,“逻辑/业务规则是相同的,但输入和收集的数据不一样”,我建议您看看Rails或Django,以获得灵感

在我的情况下,我最终开发了一个框架,该框架允许我在定义模型时扩展一个基本模型类,并简单地用一堆cfproperty标记填充它,这些标记带有自定义属性,这些属性定义了我的模型,并由基本模型类和一组处理大部分业务逻辑的服务使用。这适用于95%的情况,在任何需要偏离框架逻辑的情况下,我都会在我的cfc模型中添加额外的函数,甚至覆盖基本模型的函数

我的模特最终看起来像:

    <cfcomponent output="false" persistentLayer="GAE" persistentClass="asana" extends="com.bespokelogic.framework.BaseModel">
        <cfproperty name="id" type="string" persistentDatatype="string" settable="true" gettable="true" required="true">
        <cfproperty name="deckSet" type="string" persistentDatatype="string" settable="true" gettable="true" default="basic">
        <cfproperty name="englishName" type="string" persistentDatatype="string" settable="true" gettable="true">
        <cfproperty name="traditionalName" type="string" persistentDatatype="string" settable="true" gettable="true">
        <cfproperty name="pronunciation" type="string" persistentDatatype="string" settable="true" gettable="true">
        <cfproperty name="pronunciationNotes" type="string" persistentDatatype="string" settable="true" gettable="true">
        <cfproperty name="description" type="string" persistentDatatype="string" settable="true" gettable="true">
        <cfproperty name="type" type="string" persistentDatatype="string" settable="true" gettable="true">
        <cfproperty name="anatomicalFocus" type="array" persistentDatatype="array" settable="true" gettable="true" default="#arrayNew(1)#">
        <cfproperty name="therapeuticFocus" type="array" persistentDatatype="array" settable="true" gettable="true" default="#arrayNew(1)#">
        <cfproperty name="benefits" type="string" persistentDatatype="string" settable="true" gettable="true">
        <cfproperty name="variations" type="string" persistentDatatype="string" settable="true" gettable="true">
        <cfproperty name="contraindications" type="array" persistentDatatype="array" settable="true" gettable="true" default="#arrayNew(1)#">
        <cfproperty name="skill" type="string" persistentDatatype="string" settable="true" gettable="true">
        <cfproperty name="instructions" type="string" persistentDatatype="string" settable="true" gettable="true">
        <cfproperty name="skill" type="string" persistentDatatype="string" settable="true" gettable="true">
        <cfproperty name="prelimAsana" type="asana" persistentDatatype="Key[]" settable="true" gettable="true" default="#arrayNew(1)#">
        <cfproperty name="followupAsana" type="asana" persistentDatatype="Key[]" settable="true" gettable="true" default="#arrayNew(1)#">
        <cfproperty name="thumbnailImage" type="string" persistentDatatype="string" settable="true" gettable="true">
        <cfproperty name="primaryImage" type="string" persistentDatatype="string" settable="true" gettable="true">
        <cfproperty name="images" type="array" persistentDatatype="array" settable="true" gettable="true" default="#arrayNew(1)#">
        <cfproperty name="primaryVideo" type="string" persistentDatatype="string" settable="true" gettable="true">
        <cfproperty name="videos" type="array" persistentDatatype="array" settable="true" gettable="true" default="#arrayNew(1)#">
    </cfcomponent>


你所说的子系统是什么意思?嗯。。。难以形容。假设我有一个类似东西的多个版本,但有一些不同于它们的东西?比如,逻辑/业务规则是相同的,但是收集的输入和数据不一样。这些站点运行在同一台服务器上吗?研究策略设计模式:我已经在使用MVC了。然而,我开始计划重用这个子系统,但在开发过程中,有一些特定于项目的逻辑/数据泄漏到子系统中,保持子系统“干净”并不容易,而且ORM注释与CFC(而不是接口)相关联。。。现在是重用子系统的时候了,我担心如何在将来维护这两个版本……或者我们应该这样做。。Java构建系统?是否每次都从相应的SVN中获取子系统的最新版本?与Hudson的持续集成?9发布后我就停止了CF编码,所以我对CF ORM没有太多经验。这真的是商业逻辑,你正试图干涸,对吗?我认为完全可以复制模型/orm定义,因为实际上没有什么需要测试的,这或多或少都是可以生成的代码。所以,在关注如何干涸重要的业务逻辑时,您有一个我们可以研究的小例子吗?关于部署(re:buildsystem),是的。您可以使用依赖关系管理系统(我们使用的是Ivy)指定并包含所需基本库的特定版本。您可以对映射使用约定,也可以在WAR构建期间使用一些漂亮的Ant脚本重新编写App.cfc映射。