从 MSDN 论坛复制原始问题 在这里,但在TFS 2010中未解决。我们正在使用TFS 2012。
我有两个解决方案和对应的文件夹,如下:
SolutionA\SolutionsA.sln SolutionB\SolutionB.sln
每个解决方案都配置了 Gated Check-in build;即两个构建定义 GatedSolutionA 和 GatedSolutionB。
现在的情况是,如果我同时检入这两个文件夹中的更改,则 TFS 会显示一个对话框以选择构建(下拉菜单包括 GatedSolutionA、GatedSolutionB)来运行更改集。我的更改集中,在 Solution B 中有破坏性更改,在 Solution A 中有非破坏性更改。即构建 GatedSolutionB 将失败,但 GatedSolutionA 将通过。
当我选择 GatedSolutionA 来构建我的更改集时,TFS 会将其检入,从而使 Solution B 处于破碎状态,而 Gated check-in 的目的被解决了。
如果我将触发器更改为 CI,TFS 将排队执行两个构建。
我想要的是相同的行为,即所有 Gated 构建都排队执行,如果其中一个失败,则拒绝更改集。
注意:我不想为这两个解决方案创建单一构建定义。此外,我知道我们可以通过创建两个单独的更改集来避免发生此问题,但通常情况下,开发人员不知道他们正在为其他解决方案检查文件。
在VS/TFS 2010和TFS 2012之间是否有任何改进或更改以适应此场景?
编辑
我将尝试用一个场景来澄清。
SolutionA(我们称其为 StandardCalculator)包含2个项目,ProjectA 和 ProjectC。 ProjectA 是名为 StandardCalculatorUI 的控制台应用程序,而 ProjectC 是名为 CalculatorLogic 的类库。
SolutionB(我们称其为 AdvancedCalculator)包含2个项目。 ProjectB 是名为 AdvancedCalculatorUI 的控制台应用程序,而相同的 ProjectC(名为 CalculatorLogic)。
ProjectC 实现了用于添加、减去、除以和乘以的公共方法。
ProjectA 从 ProjectC 调用 Add 和 Subtract 的功能。
ProjectB 从 ProjectC 调用 Divide 和 Multiply 的功能。
GatedSolutionA 构建定义构建 SolutionA(因此构建 ProjectA 和 ProjectC)
GatedSolutionB 构建定义构建 SolutionB(因此构建 ProjectB 和 ProjectC)
现在,在 SolutionA 打开时,我会从 ProjectC 中删除 Multiply 和 Divide 方法,因为 ProjectA 不使用它们(但不知道 ProjectB(在 SOlutionB 中)使用)。
我有两个解决方案和对应的文件夹,如下:
SolutionA\SolutionsA.sln SolutionB\SolutionB.sln
每个解决方案都配置了 Gated Check-in build;即两个构建定义 GatedSolutionA 和 GatedSolutionB。
现在的情况是,如果我同时检入这两个文件夹中的更改,则 TFS 会显示一个对话框以选择构建(下拉菜单包括 GatedSolutionA、GatedSolutionB)来运行更改集。我的更改集中,在 Solution B 中有破坏性更改,在 Solution A 中有非破坏性更改。即构建 GatedSolutionB 将失败,但 GatedSolutionA 将通过。
当我选择 GatedSolutionA 来构建我的更改集时,TFS 会将其检入,从而使 Solution B 处于破碎状态,而 Gated check-in 的目的被解决了。
如果我将触发器更改为 CI,TFS 将排队执行两个构建。
我想要的是相同的行为,即所有 Gated 构建都排队执行,如果其中一个失败,则拒绝更改集。
注意:我不想为这两个解决方案创建单一构建定义。此外,我知道我们可以通过创建两个单独的更改集来避免发生此问题,但通常情况下,开发人员不知道他们正在为其他解决方案检查文件。
在VS/TFS 2010和TFS 2012之间是否有任何改进或更改以适应此场景?
编辑
我将尝试用一个场景来澄清。
SolutionA(我们称其为 StandardCalculator)包含2个项目,ProjectA 和 ProjectC。 ProjectA 是名为 StandardCalculatorUI 的控制台应用程序,而 ProjectC 是名为 CalculatorLogic 的类库。
SolutionB(我们称其为 AdvancedCalculator)包含2个项目。 ProjectB 是名为 AdvancedCalculatorUI 的控制台应用程序,而相同的 ProjectC(名为 CalculatorLogic)。
ProjectC 实现了用于添加、减去、除以和乘以的公共方法。
ProjectA 从 ProjectC 调用 Add 和 Subtract 的功能。
ProjectB 从 ProjectC 调用 Divide 和 Multiply 的功能。
GatedSolutionA 构建定义构建 SolutionA(因此构建 ProjectA 和 ProjectC)
GatedSolutionB 构建定义构建 SolutionB(因此构建 ProjectB 和 ProjectC)
现在,在 SolutionA 打开时,我会从 ProjectC 中删除 Multiply 和 Divide 方法,因为 ProjectA 不使用它们(但不知道 ProjectB(在 SOlutionB 中)使用)。
我提交我的代码后,系统会提示我选择一个Gated build definition进行检查(因为GatedSolutionA和GatedSolutionB的工作区中都包括ProjectC)。
如果我选择了GatedSolutionA,则检查将通过,代码被提交,但这可能会无意中破坏SolutionB。
我希望它能同时针对GatedSolutionA和GatedSolutionB进行排队,而不是强制让我选择其中一个。