【问题标题】:Detect Target Framework / NuGet DLL Incompatibility Error During Build在构建期间检测目标框架/NuGet DLL 不兼容错误
【发布时间】:2020-05-22 18:10:47
【问题描述】:

有没有办法让 NuGet/MSBuild 在构建期间报告 .csproj 目标框架/NuGet 包 DLL 引用不兼容错误?

考虑一个有两个分支的应用程序:

  • 主干分支 - 目标 .NET Framework 4.8
  • 维护分支 - 面向 .NET Framework 4.5.2。

考虑一个多目标的 NuGet 包 (PackageX)。它针对 netstandard2.0 和 netstandard1.1。由于 NuGet 包是多目标的,因此它将具有以下 lib 文件夹:

  • \packages\PackageX\lib\netstandard1.1\
  • \packages\PackageX\lib\netstandard2.0\

如果开发人员在面向 .NET Framework 4.8 的 Trunk 分支中添加对 PackageX 的引用,则 .csproj 文件将引用目录 \packages\PackageX\lib\netstandard2.0 中的 PackageX.dll强>\。

如果开发人员将他的更改从 Trunk 分支反向移植到 Maintenance 分支,则对文件夹 \packages\PackageX\lib\netstandard2.0\ 中 PackageX.dll 的 .csproj 引用将被反向移植.但是,这是维护分支代码的无效路径。因为维护分支代码面向 .NET Framework 4.5.2,所以正确的 DLL 引用应该是 \packages\PackageX\lib\netstandard1.1\。

开发人员在反向移植他的更改时几乎肯定不会意识到上面提到的 NuGet DLL 路径引用问题。 .csproj 构建时没有任何关于此问题的错误或警告。直到将维护分支代码部署到没有安装任何 .NET Framework 版本 > 4.5.2 的 QA 服务器时,才会检测到问题。会报的错误是:

FileNotFoundException - Could not load file or assembly 'netstandard, Version=2.0.0.0...

似乎应该有某种方法来检测这个 .csproj 目标框架版本/NuGet lib DLL 引用问题作为构建过程的一部分。任何人都知道可以采取任何诡计来检测和报告此问题吗?

【问题讨论】:

  • 您的 QA 服务器是否构建了您的项目然后发布了它?它有 VS 还是只有构建工具?此外,当您将项目迁移到 QA 服务器时,您应该将项目框架版本降级为 framework<=4.5.2

标签: .net visual-studio msbuild nuget


【解决方案1】:

似乎应该有某种方法可以检测到这个 .csproj 目标框架版本/NuGet lib DLL 引用问题的一部分 构建过程。任何人都知道可以做的任何诡计 检测并报告此问题?

据我所知,msbuild任务本身并没有检测nuget dll与项目框架版本不兼容的功能。构建过程只是为了检测编译文件中的任何错误,例如语法。

作为一种解决方法,您可以添加自定义目标来手动检测 nuget Dll 的参考版本和项目框架版本。

首先,在要检测的nuget dll下添加:

<Reference Include="Microsoft.Extensions.Primitives, Version=2.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
      <HintPath>...\xxxx\lib\netstandard2.0\Microsoft.Extensions.Primitives.dll</HintPath>
      <EMA>%(Reference.HintPath)</EMA>
    </Reference>

第二,编写自定义构建目标,报告nuget dll和项目框架版本。

<Target Name="Dected" AfterTargets="Build">
    <Message Importance="high" Text="the Nuget DLL Path is----%(Reference.EMA)----------------the project framework is $(TargetFrameworkVersion)">
    </Message>
  </Target>

更新 1

并且您可以在 VS 的 msbuild 日志或输出窗口中看到此信息,这将帮助您判断它们是否兼容。

请注意,当您将项目迁移到支持 framework &lt;=4.5.2 的 QA Server 时,您应该降级项目 &lt;=4.5.2 的框架版本。

另外,为了解决这个问题,您可以尝试在QA Server中恢复nuget。如果您有构建工具,请先尝试msbuild -t:store first 命令行。

【讨论】:

  • 感谢您的建议。不幸的是,我认为这对我们不起作用,因为我们正在寻找一种更全面的方法——这种方法可以检测开发人员可能不知道存在的不兼容问题。如果我的理解是正确的,那么使用这种方法,我们必须知道 PackageX 是多目标的并且存在潜在的不兼容问题。我们的一些应用程序有数百个 NuGet 包(和数百个 C# 项目),因此这种方法无法很好地扩展。
  • 实际上,nuget包中的dll版本与项目目标框架版本不一样。此外,msbuild 没有检测项目框架版本和 nuget dll 版本之间的兼容性的工作。当您使用特殊版本的dll代码时会出现错误,并且通常在您调试项目时发生。因此,您可以在构建期间手动自定义目标以报告其版本,以便您可以按照我所说的那样监控它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-04
  • 1970-01-01
相关资源
最近更新 更多