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.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 好像在依赖跟踪中丢失了,找不到文件,或者由于某些其他原因它不会复制它。

感谢您的帮助。

【问题讨论】:

【参考方案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”(True)。 A 在这里解释:***.com/questions/353617/… 最后,我注意到我的 Web.config 有一个关于 bindingRedirect 的修改行。之前: 之后: 已修复它

以上是关于Azure 管道:msbuild 不会在 _PublishedWebsites 中复制一个 DLL的主要内容,如果未能解决你的问题,请参考以下文章

MSBuild 在发布之前做 OctoPack

msbuild、dotnet sdks、azure、kudu等使用的环境变量列表

Sonarqube Azure Devops 分析后未扫描代码

Azure 发布管道:即使添加了替换镜像标签的步骤,Docker 镜像标签也不会被替换

Azure Devops:管道生成新工件时继续部署不会触发

通过 Google Cloud Pub/Sub 将数据重播到 Apache Beam 管道中,而不会使其他订阅者超载