【问题标题】:What is deps.json, and how do I make it use relative paths?什么是 deps.json,如何让它使用相对路径?
【发布时间】:2017-04-12 11:55:07
【问题描述】:

我正在 TeamCity 上设置一个 ASP.NET Core 项目。它构建的二进制文件在其他机器上启动时崩溃。错误消息显示它正在查找仅存在于构建服务器上的路径中的 dll。 DotPeek 显示.exe 中有一个嵌入的资源文件,名为myproject.deps.json。在那里的目标部分中,有使用绝对路径对 dll 的引用。这意味着 ASP.NET Core 二进制文件只能在构建它们的机器上运行。

我该如何解决这个问题?这个文件是什么,如何让它使用相对路径?经过一番挖掘,看起来路径来自project.fragment.lock.json,这是一个生成的文件。如果我编辑它以使用相对路径,则该文件将再次被覆盖。是什么产生了这种情况,如何解决或停止?

对于那些询问的人,project.json 看起来像:

{
  "dependencies": {
    "CommandLineParser": "1.9.71",
    "Microsoft.AspNetCore.Mvc": "1.0.0",
    "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0",
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.0",
    "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0",
    "Microsoft.Extensions.Configuration.FileExtensions": "1.0.0",
    "Microsoft.Extensions.Configuration.Json": "1.0.0",
    "Microsoft.Extensions.Logging": "1.0.0",
    "Microsoft.Extensions.Logging.Console": "1.0.0",
    "Microsoft.Extensions.Logging.Debug": "1.0.0",
    "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0",
    "System.Configuration.Abstractions": "1.0.0"
  },

  "tools": {
    "Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final"
  },

  "frameworks": {
    "net461": {
      "dependencies": {
        "Company.Common": {
          "target": "project"
        },
        "Company.Integration": {
          "target": "project"
        },
        "Company.Functions": {
          "target": "project"
        },
        "Company.Utils": {
          "target": "project"
        }
      }
    }
  },

  "buildOptions": {
    "emitEntryPoint": true,
    "preserveCompilationContext": true
  },

  "publishOptions": {
    "include": [
      "wwwroot",
      "Views",
      "Areas/**/Views",
      "appsettings.json",
      "web.config"
    ]
  },

  "scripts": {
    "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
  }
}

【问题讨论】:

  • 那些绝对路径引用指向第三方库?
  • @Evk 其中一些是内部图书馆的参考资料。
  • TeamCity 是安装在您的机器上,还是安装在单独的服务器上? dotnet 版本是最新的吗? deps.json 的哪一部分包含库的路径 - 你能与本地构建的进行比较并向我们展示一些差异吗?
  • @Dmitry TeamCity 安装在构建服务器上。是的,昨天安装了 .NET Core。它是 deps.json 的目标部分。唯一的区别是路径。
  • 您的项目名称是否包含空格?你能发布你的project.json吗?

标签: c# asp.net-core .net-core


【解决方案1】:

第一个问题的答案,Runtime Configuration File Documentation:

第二个问题的答案是在 project.json 文件中删除 preserveCompilationContext (并重建)。

MyApp.deps.json 是一个依赖列表,以及编译上下文数据和编译依赖。技术上不需要,但需要使用服务或包缓存/共享包安装功能。

根据您对 Dimitry 的评论,我无法判断您是否在目标计算机上安装了 .net 核心,因此无法推断您尝试进行的部署类型。但假设它已安装,您应该能够调整您的 myproject.runtime.json 来解决您的问题。如果您不这样做,我强烈建议您阅读两种不同类型的.NET Core Application Deployment:

您可以为 .NET Core 应用程序创建两种类型的部署:

依赖于框架的部署。顾名思义, 依赖于框架的部署 (FDD) 依赖于共享的系统范围 要在目标系统上显示的 .NET Core 版本。因为.NET 核心已经存在,您的应用程序也可以在 .NET Core 的安装。您的应用程序仅包含自己的代码和 .NET Core 之外的任何第三方依赖项 图书馆。 FDD 包含 .dll 文件,可以使用 dotnet 实用程序从命令行。例如,dotnet app.dll 运行 一个名为 app 的应用程序。

独立部署。与 FDD 不同,自包含部署 (SCD) 不依赖于任何共享组件出现在 目标系统。所有组件,包括 .NET Core 库和 .NET Core 运行时,包含在应用程序中,并且 与其他 .NET Core 应用程序隔离。 SCD 包含一个可执行文件 (例如 Windows 平台上名为 app 的应用程序的 app.exe), 这是特定于平台的 .NET Core 主机的重命名版本, 和一个 .dll 文件(例如 app.dll),它是实际的应用程序。

【讨论】:

  • 我的磁盘上没有myapp.deps.json。它由(我假设)VS 自动生成,并嵌入到应用程序中。
  • @TarkaDaal 如果你想在你的程序集中删除 myproject.deps.json,你可以在你的 project.json 文件中删除 preserveCompilationContext(并重建)。
  • @ciriate 就是这样!将此作为答案,您可以获得赏金。
【解决方案2】:

*.deps.json 来自preserveCompilationContext

保留编译上下文对于运行时编译(即即时编译)非常有用,特别是对于编译视图。它通常对图书馆没有用。要解决您的问题:

  1. 从您的应用引用的每个 Company.* 库中删除 preserveCompilationContext
  2. 如果这不起作用,还请从您的主应用中删除 preserveCompilationContext

这里有一个涉及的对话:https://github.com/aspnet/Mvc/issues/5141

【讨论】:

  • 我在我的 netstandard2.0 项目中添加了这个,仍然得到 deps.json
  • 我在我的net6.0项目中添加了这个,仍然得到deps.json
【解决方案3】:

如果您使用的是较新的 .csproj 格式

<TargetFramework> 标签下添加<PreserveCompilationContext>false</PreserveCompilationContext> 为我解决了这个问题。

<PropertyGroup>
    <TargetFramework>netcoreapp1.1</TargetFramework>
    <PreserveCompilationContext>false</PreserveCompilationContext>
</PropertyGroup>

【讨论】:

  • 我在我的 netstandard2.0 项目中添加了这个,仍然得到 deps.json
  • 我在我的net6.0项目中添加了这个,仍然得到deps.json
【解决方案4】:

经过全面搜索终于找到了我的解决方案,这就是我的情况: - 仅在运行时发生

dotnet 发布

所以为了解决这个问题,编辑你的 csproj 并确保有这个配置。

这适用于 webapi netcoreapp 2.0

<PropertyGroup>
    <MvcRazorCompileOnPublish>false</MvcRazorCompileOnPublish>
    <PreserveCompilationContext>false</PreserveCompilationContext>
</PropertyGroup>

这也将解决与

相关的问题

“错误 CS0246:找不到类型或命名空间名称‘系统’”

参考:https://github.com/aspnet/MvcPrecompilation/issues/162 https://github.com/dotnet/dotnet-docker/issues/279

【讨论】:

  • 上帝保佑你!在我的 .net 框架 4.7.2 上工作。
【解决方案5】:

我收到以下错误消息:

未找到应用程序依赖项清单 (MyApp.deps.json) 中指定的程序集: 包:'PropertyChanged.Fody',版本:'3.4.0' 路径:'lib/netstandard2.1/PropertyChanged.dll'

我找到了解决方案here

在csrpoj中你需要

            <PackageReference Include="PropertyChanged.Fody" Version="3.4.0" PrivateAssets="All">
                <ExcludeAssets>runtime</ExcludeAssets>
                <IncludeAssets>All</IncludeAssets>
            </PackageReference>

【讨论】:

  • 这是唯一对我有用的解决方案。我在尝试使用 net6.0 和 Anotar.Fody 使用 Resharper 运行 xUnit 测试时遇到了同样的问题。
猜你喜欢
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-25
  • 2011-06-14
  • 1970-01-01
相关资源
最近更新 更多