MSBuild 和 TeamBuild - BuildInParallel 由于 MSB3021 文件权限冲突而失败

2023-12-30

我维护着一个相当大的软件的构建,其中包含大约 350 个 csharp 项目。我们的调试构建时间约为 17 分钟。

我一直在寻找缩短构建时间的方法,BuildInParallel 属性确实看起来很有趣。特别是因为我们有一个四核服务器来进行构建,它应该真正能够利用计算能力。

但可惜...在设置属性、修改构建代理的配置文件并重新启动它之后,第一次运行确实看起来很有希望,比正常情况快得多,直到失败为止。

查看构建日志后,当尝试将标记为 CopyLocal=true 的引用复制到输出目录时,构建似乎失败了。 如果 C# 项目 A 和 C# 项目 B 并行构建,并且两者引用相同的第三方 dll,并尝试同时复制它,则尝试复制文件的第二个进程将遇到文件访问冲突 -该文件正在被另一个进程使用。

有人经历过这种情况,并且能够在 Team Build 上运行多进程构建吗?


这是失败的例子之一,很难弄清楚同时正在建设哪个其他项目。

我已经删除了所有不相关的内容:

54>目标文件中的“_CopyFilesMarkedCopyLocal” “c:\ WINDOWS \ Microsoft.NET \ Framework \ v3.5 \ Microsoft.Common.targets” 来自项目 “d:\ temp \ PCM \ 1.3-Maint_CI \ Sources \ Modules \ Core \ Test \ UnitTest \ TestDIPS.Core.Data.Server.NUnit \ TestDIPS.Core.Data.Server.NUnit.csproj”: 54>任务“复制” 将文件从“........................\Bin\3rdParty\Oracle\Oracle.DataAccess.dll”复制到 “d:\temp\PCM\1.3-Maint_CI\Binaries\Debug\Oracle.DataAccess.dll”。 命令: 复制/y“............\Bin\3rdParty\Oracle\Oracle.DataAccess.dll” “d:\ temp \ PCM \ 1.3-Maint_CI \ Binaries \ Debug \ Oracle.DataAccess.dll” 54>c:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets(2703,9): 错误 MSB3021:无法复制文件 “.......\Bin\3rdParty\Oracle\Oracle.DataAccess.dll”到 “d:\temp\PCM\1.3-Maint_CI\Binaries\Debug\Oracle.DataAccess.dll”。这 进程无法访问该文件 'd:\temp\PCM\1.3-Maint_CI\Binaries\Debug\Oracle.DataAccess.dll' 因为它正在被另一个进程使用。 完成执行任务“复制”——失败。 54>在项目中完成构建目标“_CopyFilesMarkedCopyLocal” “TestDIPS.Core.Data.Server.NUnit.csproj”——失败。


MSBuild 附带的默认目标是为 CopyLocal 行为而设计的 - 这是 VS 所依赖的。当您输出到单个输出目录时,CopyLocal 会出现问题。

为了能够真正并行构建,您需要禁用 Microsoft.*.Common.*.targets 文件中的多个 CopyLocal 特定行为。我过去曾与 MSBuild 团队中的一些人交谈过,这是一件特别棘手的事情。即使您取消了某些 CopyLocal 行为,VS 测试访问器在并行构建方面也表现不佳。

您可以从以下一些事情开始:

  1. 通过将 private 设置为 true 来禁用引用的 CopyLocal 行为。
  2. 构建依赖项目时,禁用 CopyToOutputPath 文件的 CopyLocal。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MSBuild 和 TeamBuild - BuildInParallel 由于 MSB3021 文件权限冲突而失败 的相关文章

随机推荐

  • C# - 如何在阐述时不使 WPF UI 冻结

    我有一个按钮 单击它后会循环发送远程数据库中的大量数据 但在此操作期间整个 wpf UI 冻结 我的目标是让加载程序在处理数据库的所有内容时正常工作 我的按钮代码 private void btn Start Click object se
  • 在这个小型 Nodejs 应用程序中发出 get 请求时出现“意外的文件结尾”axios 错误

    我在尝试学习在后端使用 axios 发出请求时 在这个小型 Nodejs 应用程序中遇到了此错误 意外的文件结束 axios请求文件 import axios from axios export const getData async gt
  • 在 Perl 中将模式替换为每个字符一个空格

    假设我正在尝试将 URL 与正则表达式进行匹配 text http www google com text bhttp print 1 It prints www google com 我想将它匹配的模式替换为其中每个字符一个空格 例如 考
  • JShint 不工作

    我使用 npm install g jshint 安装了 jshint 我不确定我的节点安装是否有问题或者是什么问题 但是当我在终端中运行 jshint 时 它不会执行任何操作 下一个终端提示出现时 除了空白行外 它不显示任何内容 在升级后
  • 如何修复 Visual Studio 中的“系统找不到指定的文件。(HRESULT 异常:0X80070002)”错误?

    我试图在 Visual Studio 中创建一个新项目 它给出了一些错误 please give me some suggestions 我不知道会发生这种事 我正在尝试重新安装 但又出现了同样的错误 我尝试这个行不通 如果没有其他的话 请
  • 监听滚动事件horizo​​ntalscrollview android

    我正在尝试监听事件HorizontalScrollView已滚动 尝试过这个 但它不打印任何内容 HorizontalScrollView headerScrollView new HorizontalScrollView this hea
  • Microsoft Windows 7 POSIX 实现目前处于什么位置?

    Windows 7 中是否有完整的 POSIX 实现可用 我正在考虑 Windows Services for UNIX 它在每个版本的操作系统中都可用吗 似乎不是 它如何在以前的 MS Windows POSIX 实现上添加 改进或破坏
  • TabLayout 文本重力

    我想在我的选项卡布局中设置文本的重力来开始 但我找不到任何有效的解决方案 下图显示了我想要实现的设计 下图显示了我的实际结果 My Code
  • 我可以从具有许多编译器标志的 C 程序中导出使用的代码吗?

    我想将您的 Linux 驱动程序代码压缩为仅在当前内核上运行的代码 它有一些被 if 语句忽略的部分 一直到内核 2 4 x 您是否听说过一种将代码编译为输出的方法 该输出将成为工作代码 而不会被 c 编译器 if else 语句忽略的所有
  • 将 MS Access 数据库导出到 SQL Server 2008 Express

    是否有一种简单的方法将 MS Access 数据库后端 表和关系 导出到 SQL Server 数据库 以便它可以用作使用实体框架用 C 编写的定制应用程序的后端 Access 数据库至少包含 50 个表 导出不应破坏其结构和关系 Micr
  • 如何在 Visual Studio C++ 2010 中将 BSTR 转换为 std::string?

    我正在研究 COM dll 我希望将 BSTR 转换为 std string 以传递给采用 const 引用参数的方法 看来使用 com util ConvertBSTRToString 来获取 BSTR 的 char 等效项是一种合适的方
  • 如何获取今天在 git 中提交的总行数?

    我发现了仓库存在以来 git 的一般统计数据 但我有兴趣做类似的事情 git today 并获取按作者细分的提交数 行数等内容 我最感兴趣的是当前用户的行数 我可以自己结合其他事情的结果 如果您想查看 git 存储库活动的图形表示 请使用g
  • 使用 PDFBox 从 PDF 文档中读取特定页面

    如何使用 PDFBox 从 PDF 文档中读取特定页面 给定页码 这应该有效 PDPage firstPage PDPage doc getAllPages get 0 如中所见教程的书签部分 http pdfbox apache org
  • 如何删除从网络服务返回的无法识别的字符?

    我正在开发一个调用休息网络服务的应用程序 有时 xml 响应包含电话无法显示的字符 显示这些字符时 会显示一个空框 我想过滤掉这些字符 如何检测某个字符是否能够显示在屏幕上 一些具体字符包括 http www fileformat info
  • iPhone Obj C -- 对可变字典数组进行排序 -- 显示字符串但按值排序

    我有一个 NSMutableArray 里面有 30 个字典 每个都包含一个名称和一个值 我目前已对名称进行排序 以便按字母顺序显示在表格视图中 但是 我想制作一个 UIButton 来提供仍然显示名称的选项 但按值排序 该值不需要显示 另
  • 从 TCP 套接字解析 XML 流

    我编写了一个 Ruby 脚本来通过 TCP 套接字连接到 XML 流 我想使用 LibXML 解析此 XML 流 我的问题是我不知道如何将此流传递给 LibXML 来自 LibXML 文档XML Document io io http li
  • 如何并排显示两个 Markdown 代码块

    我想并排显示源代码的两个块 重构之前和之后 是否可以并排创建两个代码块 如果不是那么替代解决方案是什么 无法使用纯 Markdown 语法在单个表格单元格中创建多行代码块 但您可以使用逐字 HTML 来完成此操作 下面是一个带有并排代码的两
  • Matplotlib 子图:imshow + 绘图

    我想创建一个如下图所示的图 图中有两个独特的情节 img1是使用生成的plt imshow while img2是使用生成的plt plot 下面提供了我用来生成每个图的代码 plt clf plt imshow my matrix plt
  • 带有输入组的引导面板

    我想做的是有一个引导面板 其左侧有一个按钮 右侧有一个按钮 有点像输入组 我希望这是有意义的 请原谅我的绘画技巧 但我想我应该附上一个例子来说明我的意思 面板可能不是最好的选择 所以如果有任何其他建议 请随时告诉我 Thanks 尝试这个c
  • MSBuild 和 TeamBuild - BuildInParallel 由于 MSB3021 文件权限冲突而失败

    我维护着一个相当大的软件的构建 其中包含大约 350 个 csharp 项目 我们的调试构建时间约为 17 分钟 我一直在寻找缩短构建时间的方法 BuildInParallel 属性确实看起来很有趣 特别是因为我们有一个四核服务器来进行构建