我们公司有一个客户端/服务器产品,我们希望客户向客户试用,针对具有虚拟数据的测试服务器,其中所有用户都默认使用一个虚拟帐户。
总结产品,在现实情况下,服务器将部署在客户的托管环境中,客户端应用程序将分发给客户自己的用户。客户端应用程序使用SOAP Web服务与服务器通信,我们使用mercurial对客户端和服务器代码库进行版本控制。
作为开发人员,我的兴趣是保持两个代码库的可维护性。我也相信无论接收虚拟数据还是实时数据,客户端的行为都应该是相同的。我需要能够将错误修正从现场推送回演示系统。但是,我需要演示版本具有特定的行为(例如,在服务器上使用虚拟数据填充虚拟数据)。
为了尝试协调这些兴趣,已将服务器代码库与硬编码设置分开,以仅显示虚拟数据并强制所有登录使用虚拟帐户。演示服务器部署到云端。然后,我们在安装程序中配置了一个客户端,指向此云服务器实例,可以下载给潜在客户试用。
我不确定这是否是最佳方法。有些人建议我应该将演示功能硬编码到实时服务器代码中,并使用隐藏标志对其进行配置 - 这样就可以完全避免使用分支代码库。
我的方法背后的原因是,在单个部署中将硬编码的演示行为添加到实时代码库中,在我看来就像代码味道一样。分支服务器允许我们继续在“实时”分支上开发服务器平台,并将错误修复推送到“演示服务器”分支,并且Web服务合同和客户端代码库保持不变。
对我而言,这似乎是一个很好的分离,因为在高层次上,我相信客户端的行为应该是相同的,无论它是从服务器接收实时数据还是虚拟数据。
我的问题是,更广泛的开发社区是否认为这种方法存在问题,或者是否有更好的策略。我的推理有效吗?在实时系统旁边管理演示系统(带有虚拟帐户/数据)的代码库的最佳做法是什么?
答案 0 :(得分:2)
那里没有任何有价值的优势,只有额外的合并努力。如果demo和live之间的差异并不重要,我建议维护一个代码库。
为了自定义演示行为,我建议如下:
条件代码包含:#ifdef DEMO ... #endif
。你有单个代码库,你有“硬编码”字符串,但它们不能编译为实时版本。
运行时插件,当您有一些接口IDataProvider
并配置demo以使用DemoDataProvider
时。您有单个代码库,可插入的演示代码,您可以从实时分发中排除。
答案 1 :(得分:1)
我不了解您的观点,但分支将迫使您合并分支以集成演示中的更改。 在我的公司,我们有几个使用相同代码库的产品,开始节省我们分叉代码库的时间,但现在我们在分支中集成演进和向后移植演进时遇到了麻烦,因此我们使用相同代码或运行时的编译时差异。 所以我的建议(我不是社区:))是不分支
答案 2 :(得分:0)
我不确定您使用的是哪种技术,但在PHP中我们有环境标志(测试,开发,生产)。使用env标志,您可以设置不同的运行时变量以反映系统的行为。您可以将子域(例如demo.yourdomain.com)绑定到env,设置它并定义您希望系统的行为方式(例如,从虚拟数据库获取数据)。
http://php.net/manual/en/reserved.variables.environment.php
希望它有所帮助。