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

Shu*_*eng 4 c# linux macos .net-core

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

dotnet --version #
3.0.101

dotnet new console -n HelloWorld

dotnet publish --self-contained --runtime linux-x64 -o ./linux-publish
Run Code Online (Sandbox Code Playgroud)

根据文章,该dotnet命令应支持命令行标志,以应用程序打包成一个单一的可执行文件:

dotnet publish -r win-x64 -c Release /p:PublishSingleFile=true
Run Code Online (Sandbox Code Playgroud)

我的问题有两个:

  1. 为什么在 macOS 上没有PublishSingleFile选项dotnet
  2. 为什么dotnet同时创建一个 HelloWorld 可执行文件和一个 HelloWorld.dll?

l'L*_*L'l 5

Re: 为什么PublishSingleFilemacOS 上没有dotnet 选项?

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

为什么dotnet同时创建一个 HelloWorld 可执行文件和一个 HelloWorld.dll?

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

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

对于自包含应用程序,RID需要指定an (您在示例中已正确完成)。我认为您可能遇到无法正常工作的问题的主要原因是您运行的是旧版本的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/
Run Code Online (Sandbox Code Playgroud)


(我使用,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
Run Code Online (Sandbox Code Playgroud)


在文件中myApp.csproj包含RID(s) 又名RunTimeIndentifers您正在构建的内容:

<Project Sdk="Microsoft.NET.Sdk">

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

</Project>
Run Code Online (Sandbox Code Playgroud)

现在回到关于由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!
Run Code Online (Sandbox Code Playgroud)

但是,您需要所有垃圾的单个文件,即位于以下位置的独立可执行文件publish

$ cd /usr/local/share/dotnet/myApp/bin/Debug/netcoreapp3.1/osx.10.13-x64/publish/
$ ls
myApp     myApp.pdb
$ ./myApp
Hello World!
Run Code Online (Sandbox Code Playgroud)

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

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

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

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