gpt4 book ai didi

c# - 如何为 `PublishSingleFile` 和 macOS 使用 `dotnet` 选项?

转载 作者:行者123 更新时间:2023-12-03 22:01:11 26 4
gpt4 key购买 nike

我用 dotnet在 macOS 上并希望为 Linux 构建应用程序。为了实现这一点,我使用以下命令:

dotnet --version #
3.0.101

dotnet new console -n HelloWorld

dotnet publish --self-contained --runtime linux-x64 -o ./linux-publish

根据 this文章, dotnet命令应该支持命令行标志将应用程序打包成单个可执行文件:
dotnet publish -r win-x64 -c Release /p:PublishSingleFile=true

我的问题有两个:
  • 为什么没有PublishSingleFile dotnet 的选项在 macOS 上?
  • 为什么dotnet两者都创建了一个 HelloWorld 可执行文件和一个 HelloWorld.dll?

  • 最佳答案

    Re: Why is there no PublishSingleFile option for dotnet on macOS?



    至少在版本 中有 3.1.100 ,所以也许尝试更新。

    Why does dotnet both create a HelloWorld executable and a HelloWorld.dll?



    这里的重要概念是可移植应用程序(默认情况下获得的)和自包含应用程序(其中生成单个可执行文件)的概念。

    可移植应用程序是独立于平台运行的应用程序,并且需要 .NET共享框架已安装。发布时,共享框架不会复制到 publish文件夹——包括 native 主机。为了运行它, dotnet <path_to_your_dll>会被调用。在这种情况下, dotnet 是 native 部分,即主机(这不是您在这里想要的)。

    对于自包含应用程序, RID需要指定(您在示例中已正确完成)。我认为您可能遇到无法正常工作的问题的主要原因是您正在运行 SDK 的旧版本。 ,所以我建议更新到当前发布版本。

    当您调用 dotnet publish 时命令它最终应该类似于以下内容:
    $ dotnet publish -r osx.10.13-x64 /p:PublishSingleFile=true
    Microsoft (R) Build Engine version 16.4.0+e901037fe for .NET Core
    Copyright (C) Microsoft Corporation. All rights reserved.

    Restore completed in 39.77 ms for /usr/local/share/dotnet/myApp/myApp.csproj.
    myApp -> /usr/local/share/dotnet/myApp/bin/Debug/netcoreapp3.1/osx.10.13-x64/myApp.dll
    myApp -> /usr/local/share/dotnet/myApp/bin/Debug/netcoreapp3.1/osx.10.13-x64/publish/

    (我使用 osx.10.13-x64 因为这是此命令的输出显示的内容):
    $ dotnet --info

    .NET Core SDK (reflecting any global.json):
    Version: 3.1.100
    Commit: cd82f021f4

    Runtime Environment:
    OS Name: Mac OS X
    OS Version: 10.13
    OS Platform: Darwin
    RID: osx.10.13-x64
    Base Path: /usr/local/share/dotnet/sdk/3.1.100/

    Host (useful for support):
    Version: 3.1.0
    Commit: 65f04fb6db

    .NET Core SDKs installed:
    3.1.100 [/usr/local/share/dotnet/sdk]

    .NET Core runtimes installed:
    Microsoft.AspNetCore.App 3.1.0 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
    Microsoft.NETCore.App 3.1.0 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]

    To install additional .NET Core runtimes or SDKs:
    https://aka.ms/dotnet-download

    在文件中 myApp.csproj包括 RID (s) 又名 RunTimeIndentifers你正在 build :
    <Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <RuntimeIdentifiers>osx.10.13-x64</RuntimeIdentifiers>
    </PropertyGroup>

    </Project>

    现在回到关于由 publish 产生的两个目录的问题。命令。 myApp.dll目录本质上是构成应用程序的所有部分。

    它可以通过以下方式执行:
    $ cd /usr/local/share/dotnet/myApp/bin/Debug/netcoreapp3.1/osx.10.13-x64
    $ ls
    (tons of files which comprise the app)
    $ dotnet myApp.dll
    Hello World!

    但是,您需要所有垃圾的单个文件,即位于 publish 中的独立可执行文件。 :
    $ cd /usr/local/share/dotnet/myApp/bin/Debug/netcoreapp3.1/osx.10.13-x64/publish/
    $ ls
    myApp myApp.pdb
    $ ./myApp
    Hello World!

    如果您想进一步了解,下面有一个冗长的讨论链接:

    https://github.com/dotnet/cli/issues/6237

    这个官方教程也可能有帮助:

    https://dotnet.microsoft.com/learn/dotnet/hello-world-tutorial/intro?sdk-installed=true

    关于c# - 如何为 `PublishSingleFile` 和 macOS 使用 `dotnet` 选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59389251/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com