2017-03-21 115 views
1

我已经对如何管理我的问题做了相当多的研究,但我似乎无法控制自己想做的事情。更重要的是,我需要创建一个解决方案,让我的团队的其他成员能够相对轻松地遵循。我尝试过的解决方案适用于单个开发人员,但会造成团队成员之间的混淆。针对分支项目的分支项目的TFS策略

我现在有一个分支结构,像这样:

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

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

我见过人们建议NuGet来处理依赖。我会很好,但我需要一种方式来让每个分支在合并时不会中断相应的依赖关系。

回答

1

最好的解决方案是使用NuGet来处理你的情况下的依赖。您可以在NuGet Config File中为每个分支定义不同的软件包源。

<packageSources> 
    <add key="NuGet official package source" value="https://nuget.org/api/v2/" /> 
    <add key="MyRepo - ES" value="http://MyRepo/ES/nuget" /> 
</packageSources> 

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

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

+1

我会不会检查NuGet配置文件?或者确保它没有合并?如果文件被合并,那么它会再次打破引用。我会仔细看看你提供的链接,它看起来很有前途,但经过快速浏览后,我没有看到如何解决依赖分支的问题。我的分支项目处于相同的深度,所以我可以轻松地引用相同的DLL,但我无法轻松引用位于不同文件夹中的DLL。他们在相同的深度,但在一个单独的文件夹中:开发/主要/质量保证 – Cory

+0

如果只有某种我可以设置的分支名称的变量。我可以将它插入到相对路径中,然后修复它。 – Cory

+0

@Cory你需要检查NuGet的配置文件,并应小心合并/分支。你可以参考这个相似的一个:http://stackoverflow.com/questions/12864330/nuget-repository-per-branch-with-tfs这是目前最好的方式,不幸的是 有没有完美的解决方案。毕竟,你也做了相当多的研究。除此之外,我们通常不会分支程序集文件夹。如果我的回复帮助或给你一个正确的方向,你可以[标记为答案](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work),这也是帮助社区中的其他人。 –

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> 
0

一段时间已经过去了,随着时间变化的例子,所以有我们的战略。如果你愿意,并且遇到依赖注入,我一直在研究更好的编程“标准”。我一直都很了解它,甚至在过去也一直在这样做。但我只是抓表面。

我们的新方法适用于Patrick-MSFT如何提及Nuget。除了现在,我已将各个区域的每个不同EF项目合并为一个解决方案,并在每次成功构建时将其部署到Nuget。然后,在我的“DemoProject”中,我使用依赖注入(构造函数注入)将适当的EF上下文(包装在存储库中)传递给控制器​​/类/ etc。

这样做,我现在可以解耦我的项目,不需要担心EF项目。这进一步有助于我们的源代码管理和持续部署。