runtimeconfig.json实际上是如何生成的?

问题描述 投票:0回答:1

我正在使用这个命令:

dotnet publish -f net6.0 <project-name> -o <output-directory> -c "Release" /p:Platform="Any CPU"

以下是 .NET Core SDK 版本详细信息:

dotnet --version
7.0.203
dotnet --list-sdks
6.0.310 [C:\Program Files\dotnet\sdk]
6.0.311 [C:\Program Files\dotnet\sdk]
6.0.317 [C:\Program Files\dotnet\sdk]
7.0.203 [C:\Program Files\dotnet\sdk]

我正在尝试构建一个依赖于框架的“非独立”.NET 6.0 控制台应用程序,我可以在 Windows 和 Linux 上使用

dotnet <dllname>
运行该应用程序,但是当针对
net6.0
时,构建过程会生成一个非常错误的
runtimeconfig.json
导致项目无法在Linux上运行:

{
  "runtimeOptions": {
    "tfm": "net6.0",
    "frameworks": [
      {
        "name": "Microsoft.NETCore.App",
        "version": "6.0.0"
      },
      {
        "name": "Microsoft.WindowsDesktop.App",
        "version": "6.0.0"
      },
      {
        "name": "Microsoft.AspNetCore.App",
        "version": "6.0.0"
      }
    ],
    "configProperties": {
      "System.Reflection.Metadata.MetadataUpdater.IsSupported": false
    }
  }
}

我尝试添加一个

runtimeconfig.template.json
,但输出结果仍然错误:

{
  "runtimeOptions": {
    "tfm": "net6.0",
    "frameworks": [
      {
        "name": "Microsoft.NETCore.App",
        "version": "6.0.0"
      },
      {
        "name": "Microsoft.WindowsDesktop.App",
        "version": "6.0.0"
      },
      {
        "name": "Microsoft.AspNetCore.App",
        "version": "6.0.0"
      }
    ],
    "tfm": "net6.0",
    "frameworks": [
      {
        "name": "Microsoft.NETCore.App",
        "version": "6.0.0"
      }
    ],
    "configProperties": {
      "System.Reflection.Metadata.MetadataUpdater.IsSupported": false
    }
  }
}

这是我的

.csproj
文件:

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <TargetFrameworks>net6.0;net6.0-windows</TargetFrameworks>
        <ApplicationIcon />
        <OutputType>Exe</OutputType>
        <StartupObject />
    </PropertyGroup>

    <PropertyGroup Condition=" '$(TargetFramework)' == 'net6.0'">
        <DefineConstants>NETCORE</DefineConstants>
    </PropertyGroup>
    <PropertyGroup Condition=" '$(TargetFramework)' == 'net6.0-windows'">
        <ApplicationManifest>app.manifest</ApplicationManifest>
        <PublishWithAspNetCoreTargetManifest>false</PublishWithAspNetCoreTargetManifest>
        <DefineConstants>NETFULL</DefineConstants>
    </PropertyGroup>
    
    <ItemGroup>
        <ProjectReference Include="..\ErpSoftLeader.Api\ErpSoftLeader.Api.csproj" />
    </ItemGroup>
    
</Project>

此项目针对一个目标构建于

net6.0-windows
中,针对另一目标构建于
net6.0
中。 Windows 构建按预期工作,多平台构建则不然。

为什么在构建中添加

Microsoft.WindowsDesktop.App
,而不是请求它,我如何控制
runtimeconfig.json
的输出,以便我的
Net6.0
构建不请求
Microsoft.WindowsDesktop.App

我必须补充一点,还有另一个项目使用相同的项目引用,它不会在runtimeconfig.json上犯这个错误,但是这个另一个项目在SDK属性中使用

Microsoft.NET.Sdk.Web
作为它的csproj,这有什么相关吗?

.net-core compilation .net-6.0
1个回答
0
投票

我明白了这里发生了什么,我的管道在构建该行之前有一个构建 net6.0-windows,因此之前的构建生成了 runtimeconfig.json 并将其保留在中间输出目录中,然后是 net6.0-windows。 0 构建过程会跳过生成此文件并仅将其复制到输出位置,删除此中间目录会导致 net6.0 构建过程实际生成此文件,并且正确而不是跳过它。 看来该项目正在将两个框架目标构建到同一中间目录,然后将其复制到输出位置,该中间目录未在解决方案中的任何配置文件中定义,并且不会使用

dotnet clean
命令清除,我我假设这是来自
-o
命令行选项的奇怪行为

© www.soinside.com 2019 - 2024. All rights reserved.