2017-07-24 30 views
0

我们有很多相互依赖的构建(例如构建A必须在构建B之前运行,因为构建B引用了构建A中创建的.dll),所以在每个版本的源设置中,我们对生成代理文件夹进行了硬编码。它不能是默认的$(SystemDrive)\ Builds \ $(BuildAgentId)\ $(BuildDefinitionPath),因为然后后续的版本不知道从哪里获得源代码。但现在我已经设置了CI构建和我经常收到错误:TFS 2013 build源设置全部共享相同的目录,这就是生成错误

Exception Message: Unable to create the workspace '106_33_pgbuildorig' due to 
a mapping conflict. You may need to manually delete an old workspace. 

我最初尝试设置CI构建使用不同的文件夹,但事实证明,我们需要他们在同样的文件夹也是如此,因为我们希望在后续其他版本中获取来自CI构建的最新输出。

任何想法,我可以避免必须手动删除Team Build创建的工作空间吗?

其实我不知道这些构建最初是如何工作的(我刚开始在这里工作),因为它看起来像对源代码设置进行硬编码会导致重叠创建工作区,并且无论如何会在其下一次运行时失败。

回答

1

你应该停止像这样依赖彼此的构建。除了您遇到的显而易见的问题之外,这只是一个普遍不好的做法,因为它会生成生成不一定表现一致的二进制文件的生成。如果我重新编译旧的源代码,我应该得到显示相同行为的输出。如果您依赖于外部生成的不断变化的二进制文件,则无法保证这一点。你甚至不能保证旧的代码将被编译。

这也使得难以有效地扩展您的构建基础架构而不是单个构建代理。

更好的解决方案取决于您的方案了一点,但粗略地讲:

  • 如果你这样做的原因是因为你有所有依赖于一组共享组件的多个应用程序,使用NuGet软件包可以在需要使用这些二进制文件的不同应用程序之间共享版本化的二进制文件。
  • 如果原因是构建速度(这是一个很大的应用程序,并且您不想在Y变化时重建X + Y),使用NuGet程序包
  • 如果以上都没有,只是立即构建一切
+0

谢谢丹尼尔。我知道这不是一个好的情况,但正如我刚才说的,我刚从这里开始,所以需要一段时间才能清理干净。我甚至无法弄清楚为了让他们工作而创建什么命令。有大约215个解决方案文件,在12个左右的构建中引用了25个左右的解决方案文件,但几乎每个解决方案都包含对其他.csproj文件或从其他构建生成的.dll的引用。 –

+0

只是好奇的丹尼尔 - 在这种情况下NuGet包会如何帮助?我对NuGet的唯一体验是第三方附加组件。 –

+0

@Ben_G您的组件可以单独构建并发布到NuGet源,然后由每个相关应用程序引用并在构建期间恢复。在某种程度上,它只是形式化你当前正在做的事情 - 二进制文件被创建和发布,因此它们可以被需要它们的其他应用程序引用。不同之处在于,NuGet包是版本化的,可以根据需要从已知的位置进行恢复。 –