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

时间:2019-12-18 09:43:41

标签: c# linux macos .net-core

我在macOS上使用dotnet,并希望为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

我的问题有两个:

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

1 个答案:

答案 0 :(得分:1)

  

回复:为什么macOS上的dotnet没有PublishSingleFile选项?

至少存在版本 3.1.100 ,因此请尝试更新。

  

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

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

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

对于独立应用程序,需要指定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又名RunTimeIndentifers

<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