【问题标题】:.NET Core Class library using EFCore DbContext as Nuget not finding EFCore.NET Core 类库使用 EFCore DbContext 作为 Nuget 没有找到 EFCore
【发布时间】:2021-03-19 13:15:24
【问题描述】:

我正在尝试将数据访问服务构建为 .NET Core 3.1 类库,然后将其制成一个 nuget 包,可以在不同的解决方案中重复使用,而无需在每个解决方案中搭建数据库和构建存储库类。

类库代码经过测试可以正常工作,但是在另一个解决方案中安装了nuget,调用数据服务中的方法时会抛出此错误:

System.IO.FileNotFoundException: '无法加载文件或程序集 'Microsoft.EntityFrameworkCore,版本=5.0.4.0,文化=中性, PublicKeyToken=adb9793829ddae60'。系统找不到文件 指定

显然,使用 nuget 的解决方案或 nuget 本身缺少对 EntityFrameworkCore 的依赖,但我不确定是哪个以及为什么。

当从我安装了 nuget 的解决方案中查看解决方案资源管理器中的 DataService.dll 时,它没有显示该 .dll 的任何依赖关系,它与其他已安装的 nuget 一样。 我已确保 nuget restore 由部署管道运行(使用 Azure DevOps 释放 nuget),据我所知,它正在获取所有 EFCore 依赖项。

Azure DevOps 在 .nuspec 中生成它:

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
  <metadata>
    <id>SoRDataAccess</id>
    <version>1.1.4</version>
    <authors>VssAdministrator</authors>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Description</description>
    <dependencies />
  </metadata>
</package>

有没有人成功地做到这一点或知道这应该是可能的。我开始担心这可能与 EFcore 无关,但我还没有找到任何可以确认的信息。

【问题讨论】:

  • 创建 Nuget 包时,是否指定了对该库的依赖项?分享您的 .nuspec。
  • @mason nuspec 是由 DevOps 生成的,几乎是空的。在工作 nugets 中看起来是一样的。 EFCore 的依赖项在 .csproj 中指定
  • 即使 nuspec 是由 DevOps 生成的(你的意思是 Azure DevOps?),它是否包含依赖关系?在我们所有的内部 NuGet 包中,我们明确地调用了我们的包所依赖的任何外部依赖项。然后,当有人使用该包时,它可以看到该依赖项并强制执行约束。这取决于您构建构建的准确程度 - 但如果我们在源代码中提供 .nuspec,我们将跳过自动生成 .nuspec。这使我们能够明确控制我们的包最终依赖的依赖项。再次:分享您的 nuspec!
  • @mason 已编辑以包含 nuspec。
  • 看起来像是 .NET 5.0 与 .NET Core 3.1 的版本控制问题。也许您的管道没有完全更新,或者以某种方式试图同时支持两者,但不正确。

标签: c# .net entity-framework nuget


【解决方案1】:

您应该能够创建自己的 .nuspec,然后将其打包。

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
  <metadata>
    <id>MyPackageId</id>
    <version>$version$</version>
    <title>My Package Title</title>
    <authors>My Company Name</authors>
    <owners>My Company Name</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>A description of our package</description>
    <copyright>Copyright 2021</copyright>
    <dependencies>
      <group targetFramework=".NETStandard2.0"> <!-- Libraries *should* target .NET Standard in most cases -->
        <dependency id="SomeOtherNugetPackageInSameSolutionThatShouldHaveSameVersion" version="$version$" />
        <dependency id="Microsoft.Azure.ServiceBus" version="4.1.1" /> <!-- Specify your external dependencies and their required version here -->
      </group>
    </dependencies>
  </metadata>
  <files>
    <file src="bin\$configuration$\netstandard2.0\MyLibrary.dll" target="lib\netstandard2.0" />
  </files>
</package>

当您在 Azure DevOps 中构建包时,您应该能够选中一个框以将 $version$ 替换为版本。否则,您可以对其进行硬编码。取决于您的团队如何进行版本控制。

重要的部分是&lt;dependencies&gt; 部分。

【讨论】:

  • 虽然这是一个可行的解决方案,但 .csproj 中的 PackageReference 格式已经取代了在这种情况下对 .nuspec 的需求。问题出在管道上,它使用的是 .NET 5 而不是 dotnetcore 的任务。
【解决方案2】:

通常在使用 Jenkins 或 Azure DevOps 等 devops 产品时,当构建服务器和/或构建代理未完全更新或更新但未完全更新时,您可能会遇到这样的问题。

您的管道似乎需要重新配置。

发生这种情况时,请查看数字——特别是版本号。当他们看起来不对劲时,这表明有些事情不对劲。在您的情况下,您说您正在构建 .NET Core 3.1,但正在寻找 EF 5.0.4.0。虽然版本没有必须匹配,但实际上它们倾向于匹配。

有趣的是,在我的软件开发生涯中,这种情况发生过很多次。最近,当我们开始支持 .NET Core 3.1 而不是 .NET Core 2.2 时,就发生了这种情况。当构建在您的机器上运行而不是在构建服务器上运行时,它很快就会变得明显!

基本上,管道的每个部分都需要正确处理这些方面:从源代码管理中提取、从配置存储库(例如 NuGet)中提取、在上下文中构建和发布。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-17
    • 2021-05-04
    • 2020-01-31
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-25
    相关资源
    最近更新 更多