具有分支依赖性的分支项目的TFS策略

时间:2017-03-21 15:58:01

标签: entity-framework tfs continuous-integration

我已经对如何管理我的问题进行了相当多的研究,但我似乎无法掌握我想做的事情。更重要的是,我需要创建一个解决方案,我的团队的其他成员将能够相对容易地遵循。我尝试过的解决方案适用于单个开发人员,但会导致团队成员之间的混淆。

我目前有一个像这样的分支结构:

  • 项目名
      • DemoProject
      • DemoEntityFramework
    • QA
      • DemoProject
      • DemoEntityFramework
    • 开发
      • DemoProject
      • DemoEntityFramework

我想将DemoEntityFramework拉出来并以相同的方式分支它,Main / QA / Dev。我需要它分支的原因是因为数据库结构在分支之间不同是很常见的。因此,当指向EntityFramework的PROD版本时,QA将无法正确构建。将其解决的另一个原因是因为我有其他项目依赖于相同的框架,我可以重用库而不必在这些项目中保留实体框架的其他副本。

我见过人们建议NuGet来处理依赖。我会没事的,但是我需要一种方法让每个分支在我合并时不会破坏各自的依赖。

3 个答案:

答案 0 :(得分:1)

最佳解决方案是使用 NuGet 来处理您案例中的依赖关系。您可以在NuGet Config File中为每个分支定义不同的包源。

TreeMap<String, List<JSONObject>>

您可以为每个分支创建不同的NuGet存储库,为每个分支创建不同的NuGet配置文件,并在该配置文件中定义正确的存储库URL。

如果您不喜欢使用Nuget,则希望将所有依赖程序集保留在分支外部的团队项目中的文件夹中。要确保相对引用不中断,您必须保持所有分支在团队项目中处于相同的文件夹深度。无论assembly文件夹是否分支,都应该正确创建相对引用。更多细节请参考此博客:Project Dependencies will break with branching if not done properly

答案 1 :(得分:0)

我包括这个答案,因为这是一种与正常情况不同的方法,但它似乎最符合我的情况。

我实际上非常喜欢NuGet方法,但我真的不喜欢NuGet配置之间存在差异的想法。有人在分支之间意外地合并该文件,以及防止在整个分支上进行合并的可能性很容易。

我已经在项目中定义了不同的配置来进行连接字符串之类的转换。我真的希望有一种方法可以用项目引用做同样的事情。结果是there is a way。根据选择的配置,我现在可以指向不同的DLL路径。即使他们不在同一层级中。现在,我只是根据配置指向适当的分支。

以下是我在.csproj

中更改内容的示例
<ItemGroup Condition="'$(Configuration)' != 'Dev'">
  <Reference Include="MyReference, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
    <HintPath>C:\Example\Prod\MyReference.dll</HintPath>
    <Private>True</Private>
  </Reference>
</ItemGroup>
<ItemGroup Condition="'$(Configuration)' == 'Dev'">
  <Reference Include="MyReference, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
    <HintPath>C:\Example\Dev\MyReference.dll</HintPath>
    <Private>True</Private>
  </Reference>
</ItemGroup>

答案 2 :(得分:0)

一段时间过去了,随着时间的推移,我们的策略也是如此。我一直在研究更好的编程和标准&#39;如果你愿意并且遇到依赖注入。我一直都知道它,甚至在过去也曾经过它。但我只是摸不着头脑。

我们的新方法与Patrick-MSFT如何与Nuget一起提及。除此之外,现在,我已将各个地区的不同EF项目合并为一个解决方案,并在每次成功构建时部署到Nuget。

然后,在我的&#34; DemoProject&#34;我使用依赖注入(构造函数注入)将适当的EF上下文(包装在存储库中)传递给控制器​​/类/等。

这样做我现在可以将我的项目与需要担心EF项目分开。这进一步有助于我们的源代码控制和持续部署。