Azure 管道:msbuild 不会在 _PublishedWebsites 中复制一个 DLL
Posted
技术标签:
【中文标题】Azure 管道:msbuild 不会在 _PublishedWebsites 中复制一个 DLL【英文标题】:Azure pipeline: msbuild does not copy one DLL in _PublishedWebsites 【发布时间】:2021-09-14 18:38:41 【问题描述】:我的 Azure Pipeline 上的 msbuild 有一个奇怪的行为。 我将 Azure Pipeline 与自托管 Windows 代理一起使用。
配置:
我的 Visual Studio .sln 包含两个 C# 项目:
Web 服务(Rest API) 业务层此外,业务层还依赖于其他 2 个项目。
Kernel.DataModel Kernel.DataAccessKernel.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 好像在依赖跟踪中丢失了,找不到文件,或者由于某些其他原因它不会复制它。
感谢您的帮助。
【问题讨论】:
【参考方案1】:您的 *.csproj 是否有可能针对错误的 HintPath
?
你能检查一下你是否有这样的东西:
<Reference Include="Microsoft.SqlServer.Types">
<HintPath>..\packages\Microsoft.SqlServer.Types.YOURVERSION\lib\net40\Microsoft.SqlServer.Types.dll</HintPath>
</Reference>
谢谢
【讨论】:
我决定直接在WebService中添加“Microsoft.SqlServer.Types”NuGet包。我还验证了 .csproj 中的“CopyLocal = True”(以上是关于Azure 管道:msbuild 不会在 _PublishedWebsites 中复制一个 DLL的主要内容,如果未能解决你的问题,请参考以下文章
msbuild、dotnet sdks、azure、kudu等使用的环境变量列表
Sonarqube Azure Devops 分析后未扫描代码