单个Codebase多个网站

时间:2009-10-07 08:32:15

标签: version-control

我们开发了一个使用单一代码库的系统,包括四个带有管理网站的Visual Studio项目和面向客户的网站(每个系统都有自己的MS SQL数据库)。

这一直很有效,因为所有新网站(包括管理员)都在SVN中引用相同的代码库项目,因此对代码库所做的任何更改都可供所有网站使用。

每个网站都有不同的母版页和不同的用户控件(.ascx),因此虽然网站背后的主要编码是相同的,但部分不同。

我们现在遇到的问题是,如果存在错误,功能更改或新功能,我们必须在所有站点中单独实施(对于管理员和客户站点)。这开始让我们感到疯狂,也意味着我们在实施变革方面存在巨大的误差。

我考虑过使用svn:externals,但这会变得很乱。

从主网站和主管理系统分支可能是选项,但合并以获取新代码是一个主要问题,网站不完全相同。

我认为一个很好的概述可以说每个站点的标记完全不同(除了管理站点,这只是一个主题更改)但代码库是相同的。

管理此问题的最佳方式是什么,或者我们是否坚持进行大量复制和粘贴?

修改

您希望明确哪些要点?

出现的问题是在页面JavaScript不同的情况下,HTML布局在网站之间可能完全不同。但是页面的代码是一样的。

所以我需要'同步'文件和文件夹,例如在app_code中找到的文件和文件夹,但这里也存在问题。

网站1和网站2可能完全相同,只是一个不同的主题。 站点3也有不同的主题,但它也有一些只有本网站需要的定制代码,app_code中的一些代码对站点1和站点2的行为也不同

现在我可以通过分支轻松实现这一点,但是当合并到新分支时,如果存在代码差异,则会发生重大冲突。

合并也会成为一项大任务并且耗时太长,因为我们只需要合并某些文件夹和文件,尽管您无法通过分支合并单个文件(这可能是错误的)。

例如:

在root中有一个download.aspx,它返回一个流作为响应而不是一个页面,用于通过系统推送所有下载请求。

因此,站点1和站点2中的此页面是相同的,但在站点3中,它执行了额外的操作,这是其他站点不需要或不需要的。

我们不希望这个定制功能过载,因为我们不希望/需要它用于其他网站,我们现在不能再合并此文件,从主网站,它必须手动合并。< / p>

希望这能更好地解释我想要实现的目标。

编辑2

基本网站结构

|- App_code
|- App_Themes
|- Bin
|- Content
|     |- Flash
|     |- Images
|     |- Scripts
|     |- Uploaded
|
|- Controls
|     |- MasterPage
|     |     |-MasterPageControls
|     |
|     |- Navigation
|     |- Search
|     |- Templates
|     |     |- Control Templates 
|     |     |- Page Templates
|     |
|     |- WebServices
|     
|- Errors
|

控件导航,搜索,模板下的所有内容都是.ascx文件。

在root中有几个文件,包括default.aspx,download.aspx和preview.aspx

这些是网站的主要页面(忽略错误页面),所有页面都是从数据库中动态创建的。

Controls文件夹是网站之间的大多数更改发生在MasterPage和所有其他用户控件中的地方。

8 个答案:

答案 0 :(得分:4)

几个月前,当我们开始重大改写我们的网络应用程序时,我遇到了这个问题。我们有两个几乎相同的网站版本。后端代码是99%相同,而JavaScript,CSS和其他前端的东西是非常不同的。我们在同一个SVN存储库中将这两个站点放在单独的中继中,很快就成了复制和发送的噩梦。粘贴它们之间的公共代码。由于文件略有不同,修补和合并太麻烦了,无法使用。

我们的解决方案既不是与SVN相关的,也不是建立共同的库。相反,单个站点的概念是通过多个配置文件和CSS,图像和语言资源文件的层次结构在单个代码库中定义的。特定于站点的功能由配置值启用。

每个站点都会获得一个唯一的名称(例如“foo”和“bar”),该名称在运行时从Web.config文件中检索。该名称用于确定加载哪个配置文件以及要使用的客户端文件。 SVN中的设置为空白。复制到Web服务器时,它由我们的部署脚本设置。在我们的本地开发机器上,环境变量定义了我们想要使用的站点。

特定于站点的文件的文件结构如下所示:

|- Config
|     |- AppSettings.foo.config      <- overrides Web.config AppSettings for "foo" site
|     |- AppSettings.bar.config      <- overrides Web.config AppSettings for "bar" site
|- Content
|     |- CSS
|          |- main.css               <- default CSS file for all sites
|          |- main.foo.css           <- CSS overrides for "foo" site
|     |- Images
|          |- logo.jpg               <- default logo
|          |- logo.foo.jpg           <- logo used if site name is "foo"
|          |- logo.bar.jpg           <- logo used if site name is "bar"

到目前为止,这对我们来说非常有用。向特定网站添加新功能就像将功能添加到我们的代码库一样简单,只为该网站启用它。

答案 1 :(得分:0)

我不确定我是否正确了解您的情况,但您可以在第4章的Subversion book中找到有关如何维护SVN存储库的线索。

您似乎要么必须为SVN树建立良好的例程,要么必须更改代码,以便尽可能多地对所有网站进行通信,并且差异是可配置的。例如,您可以使用与站点无关的代码创建项目,然后将更改编码为构建在其上的项目。

至于更新站点本身,这必须通过与subversion树中的适当点同步来完成,或者您必须执行新版本(或升级)。

答案 2 :(得分:0)

你说你有一个SVN仓库,包含所有网站的代码库。所以,除非我误解,否则你不能简单地将任何共享组件移动到该存储库中吗?

您提及的页内Javascript之类的内容应尽可能在外部。如果HTML布局完全不同,则Javascript可能会有很大差异。

  

因此,站点1和站点2中的此页面是相同的,但在站点3中,它执行了额外的操作,这是其他站点不需要或不需要的。我们不希望这个定制功能成为超载,因为我们不希望/需要它用于其他网站

无法在网站3上扩展下载代码,因此您在所有网站上都有一个共同基础,但在网站3上扩展它。

答案 3 :(得分:0)

如果我正确理解了该问题,您可以在一个存储库中获得四个大致相似的网站的代码。网站实例具有自定义功能。原始帖子中的妙语,这个问题,表达了对“坚持做大量复制和粘贴”的担忧。在各个方面,您表示对“合并”和“手动合并”感到沮丧。

我认为你使用svn将新代码分发给四个主机。

也许您的代码库正在接近可以将公共材料视为库的有利位置。在此视图中,四个网站中的每一个都被视为从库中构建的应用程序。如果是这样,那么在颠覆中为四个应用程序中的每个应用程序提供自己的repo是有意义的。开发工作将把共同特征与自定义功能分开,或许使“库”代码上的API更加清晰地定义。然后每个主机检出库代码和它自己的应用程序。

这接近你的想法吗?

答案 4 :(得分:0)

和其他人一样,我对你的问题感到有点困惑,但我认为我对这个问题有一个大致的了解。在这种情况下,您需要尝试做的是将每个客户端/项目的自定义抽象到单独的库中,并使原始代码库无法自定义。基本代码应仅包含适用于所有站点的通用功能(尽管可以更改某些功能,以便您可以根据需要切换其可用性)。

如果您做得对,您应该能够随时将原始代码库导出/发布到任何给定的站点,而不是搞砸了。任何自定义都应保持不变。

答案 5 :(得分:0)

答案 6 :(得分:0)

三个想法,按效用和努力的升序排列:

1)珩磨“每个站点的标记完全不同(管理站点除外,这只是主题更改)但代码库是相同的。”

您可以将多少“代码”转移到共享的DLL项目中?如果它几乎全部,那么你可以为每个标记集维护单独的项目,那些将使用DLL作为参考。

显然,如果你有很多不在AppCode中的代码,这根本不可行。如果没有,这可能是减少精神错乱的快速途径。

2)是否可以为每个站点维护共享代码的存储库和单独的存储库?然后,您需要创建自己的部署脚本来处理从正确的存储库中提取源代码并将其放在正确的位置。

根据代码/标记的紧密耦合程度,这可能也不可行。

3)最后,如何将不同的代码移动到数据库中并让应用程序在部署时自行生成?

显然,这是最重要的,但它可以让你到达你想去的地方。

答案 7 :(得分:0)

我首先要感谢大家的意见。

我现在已经解决了(或多或少)这个问题。

我所做的是将所有图像移动到Themes文件夹中,并在模板和控件文件夹中创建子文件夹,其中定制控件将存在。 我已经在数据库模式中创建了一些功能,这些功能为我提供了帮助。

我对系统的预先计划有很多内容,我没有完全实现并忘记了。

我还为网络服务等部分代码分离了一些代码,至少可以自行生存的网络服务。

总的来说,我们已经找到了解决方案,所以我不确定将这些积分奖励给谁?