Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.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
Version control 被多个网站引用的类库+;版本控制分支_Version Control_Tfs_Architecture - Fatal编程技术网

Version control 被多个网站引用的类库+;版本控制分支

Version control 被多个网站引用的类库+;版本控制分支,version-control,tfs,architecture,Version Control,Tfs,Architecture,考虑以下事项: 我有一个由多个项目组成的解决方案: DAL(类库) 业务逻辑(类库) 网站1(Web应用程序) 网站2(Web应用程序) Website1和Website2都共享对BusinessLogic的引用,后者反过来又引用DAL 由于这些只是网站,因此我不需要跟踪多个版本,但我确实希望有以下分支: 树干 生产 主干是我进行所有开发工作的地方,在所有工作都经过测试并准备就绪后,当网站实际部署到生产服务器时,我会从主干合并到生产服务器。这使我可以搁置当前的工作,检查生产分支,解决部署

考虑以下事项:

我有一个由多个项目组成的解决方案:

  • DAL(类库)
  • 业务逻辑(类库)
  • 网站1(Web应用程序)
  • 网站2(Web应用程序)
Website1和Website2都共享对BusinessLogic的引用,后者反过来又引用DAL

由于这些只是网站,因此我不需要跟踪多个版本,但我确实希望有以下分支:

  • 树干
  • 生产
主干是我进行所有开发工作的地方,在所有工作都经过测试并准备就绪后,当网站实际部署到生产服务器时,我会从主干合并到生产服务器。这使我可以搁置当前的工作,检查生产分支,解决部署后发现的任何主要错误,并立即部署修复程序

我的问题是,使用这种方法,生产分支中的内容并不总是正确的。假设我对网站1使用的BusinessLogic进行了更新。它通过测试并部署。如果我将所有项目合并到生产分支,那么这是错误的,因为当时Website2没有部署到生产中

或者,我只能将相关项目合并到生产中。因此,在本例中,我将合并Website1、BusinessLogic和DAL。然而,这仍然是错误的。如果我去生产部门查看Website2,它将拥有比我们生产服务器上实际存在的更新版本的BusinessLogic和DAL


这里的正确方法是什么?

有很多正确的方法,这取决于什么对你来说是正确的。当然,每种方法都有利弊

如果需要源级别的依赖项,请为每个站点创建几个生产分支,每个分支包括外部分支:

  • /地点1/生产
    • 网站内容
    • BusinessLogic[外部]->/BusinessLogic/v1Branch
  • /地点2/生产
    • 网站内容
    • BusinessLogic[外部]->/BusinessLogic/v1Branch
  • /BusinessLogic/v1Branch(来自DevBranch)
  • /BusinessLogic/DevBranch
以下是您执行版本升级的方式:

  • 更改
    业务逻辑/DevBranch
    ,测试它
  • 将it分支为
    BusinessLogic/v2Branch
  • 更新
    Site2/Production
    的外部指向
    BusinessLogic/v2Branch
  • 构建站点2、测试和部署
所以你会有-

  • /地点1/生产
    • 网站内容
    • BusinessLogic[外部]->/BusinessLogic/v1Branch
  • /Site2/制作
    • 网站内容
    • BusinessLogic[外部]->/BusinessLogic/v2Branch
  • /BusinessLogic/v1Branch(来自DevBranch)
  • /BusinessLogic/v2Branch(来自DevBranch)
  • /BusinessLogic/DevBranch
这需要一定程度的开发文化和一定数量的svn管理

此外,您还可以将二进制文件放入此类svn分支,这与方案基本相同。通常这种方法被命名为



如果您更喜欢源代码管理之外的二进制依赖项,那么可以利用本地nuget存储库。它的工作原理与官方版本相同:您创建一个新版本,发布到nuget,然后从站点、构建和部署引用它。这需要额外的设置和维护工作,更适合大型项目。

您不应该使用代码共享或代码升级模式。它降低了质量并迫使返工。相反,您可以创建一个发布管道,为您的业务和Dal层创建一个包,并使用web应用程序中打包的包

最好的方法是使用构建服务器并为业务层使用的DAL创建NuGet包。这反过来又被打包成一个NuGet包,您的网站可以使用它

然后,将业务层更改添加到网站中的工作流是:

  • 打开业务层解决方案并进行修复
  • 签入并触发CI生成
  • CI build创建并发布NuGet包
  • 打开网站解决方案并更新NuGet软件包

  • 干净简单。没有分支就是好的分支。

    使用分支来解决这个问题是功能失调的,会导致代码质量的长期降低和大量的返工。@MrHinsh“这需要一定程度的开发文化和一定数量的svn管理。”如果您仔细阅读的话。当然会的。但一般来说,代码质量取决于编码器。有些人甚至会破坏《金色密码》的降落伞。在使用只读供应商分支时,我没有发现任何问题。此外,从技术上讲,它只是另一种形式的相同代码。正如您可能还注意到的,我也建议通过nuget进行二进制分发。它带来了与非二进制相同数量的问题,问题本身也不同。如果你愿意的话,这只是源代码对二进制的圣战。代码共享从来都不是解决这个问题的正确方法。您将得到多个不同的dll,其中包含相同的编译代码。这是错误的,永远不应该鼓励。