【发布时间】:2021-09-14 18:38:41
【问题描述】:
我的 Azure Pipeline 上的 msbuild 有一个奇怪的行为。 我将 Azure Pipeline 与自托管 Windows 代理一起使用。
配置:
我的 Visual Studio .sln 包含两个 C# 项目:
- Web 服务(Rest API)
- 业务层
此外,业务层还依赖于其他 2 个项目。
- Kernel.DataModel
- Kernel.DataAccess
Kernel.DataAcess 层正在使用 NuGet 包“Microsoft.SqlServer.Types”(14.0.314.76)
项目 Kernel.DataAccess 中的引用“Microsoft.SqlServer.Types”具有“Copy Local = True”。因此应将 DLL 文件复制到输出(发布)目录中。
问题:
当我运行 Azure 构建管道时,文件“Microsoft.SqlServer.Types.dll”未复制到“_PublishedWebsites”目录中。
为了说服自己,我决定通过更改代理池在另一台构建机器上运行 same 管道。令我惊讶的是,DLL 出现在第二台构建机器上的“_PublishedWebsites”中。
此外,我决定在本地计算机上手动运行 msbuild 命令,并且 DLL 也存在于我本地计算机上的“_PublishedWebsites...\bin”中。
日志文件:
我还查看了构建机器和本地计算机上的日志文件。
-
第一个构建机器 -> DLL 文件根本没有被复制!
-
第二台构建机器 -> DLL 文件从该位置复制。
Copying file from "C:\Program Files (x86)\Microsoft SQL Server\140\SDK\Assemblies\Microsoft.SqlServer.Types.dll" to "F:\AgentLatestBuild\A1\_work\28\b\_PublishedWebsites\ApiProject\bin\Microsoft.SqlServer.Types.dll".
- 本地机器->
_CopyFilesMarkedCopyLocal:
Copying file from "C:\TFS\Repos\Src\Project\**packages**\Microsoft.SqlServer.Types.14.0.314.76\lib\net40\Microsoft.SqlServer.Types.dll" to "E:\tfs\build\Microsoft.SqlServer.Types.dll".
Copying file from "E:\tfs\build\Microsoft.SqlServer.Types.dll" to "E:\tfs\build\_PublishedWebsites\ApiProject\bin\Microsoft.SqlServer.Types.dll".
如您所见: 在第二台构建机器上,msbuild 不使用 NuGet packages 文件夹,但它使用“C:\Program Files (x86)\Microsoft SQL Server\140\SDK\Assemblies \Microsoft.SqlServer.Types.dll"
在我的本地计算机上,DLL 是从 NuGet packages 文件夹复制的。
这是我的问题:
msbuild.exe 如何选择 DLL 的源/位置?
有没有办法强制 msbuild 首先使用 NuGet packages 而不是任何其他文件夹?
我认为 msbuild 应该首先查看 NuGet 包文件夹,如果找不到 DLL,那么它应该尝试从其他地方找到它。 (C:\Program Files (x86)、GAC 等)
最后,您知道为什么“Microsoft.SqlServer.Types.dll”根本没有在第一台构建机器上复制吗? DLL 至少存在于三个位置。 (即:NuGet 包文件夹,C:\Program files\,它也在 GAC 中)。
msbuild 好像在依赖跟踪中丢失了,找不到文件,或者由于某些其他原因它不会复制它。
感谢您的帮助。
【问题讨论】:
标签: visual-studio azure-devops msbuild dependencies azure-pipelines