我在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
我的问题有两个:
PublishSingleFile
没有dotnet
选项?dotnet
都创建一个HelloWorld可执行文件和一个HelloWorld.dll?答案 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