如何在osx上分发.net core 2.0控制台应用程序

问题描述 投票:11回答:2

我正在使用Visual Studio for Mac,我的应用程序是写的,它做我想要的。用户的目标平台是OSX。它依赖于2个具有自己依赖关系的Nuget包,具体来说:

  • 不,不
  • Microsoft.Extensions.Configuration.CommandLine

我运行以下命令到build应用程序:

dotnet build -c Release -r osx.10.11-x64

输出告诉我它成功并显示我放置文件的位置。

包含在该文件夹中的是以下文件,这个文件夹是我假设我分发给我的用户,但这会导致错误,因此这个问题:

MyApp <---- executable
MyApp.deps.json
MyApp.dll
MyApp.pdb
MyApp.runtimeconfig.dev.json
MyApp.runtimeconfig.json
libhostfxr.dylib
libhostpolicy.dylib

所以我的用户收到了这个,他们安装了dotnet运行时。当他们去运行可执行文件(这里MyApp又名./MyApp)时,他们收到以下错误:

An assembly specified in the application dependencies manifest (MyApp.deps.json) was not found:
package: 'AsyncIO', version: '0.1.26'
path: 'lib/netstandard1.3/AsyncIO.dll'

现在,AsyncIONetMQ的依赖,所以它就是来自的地方。但是,我可以从我的文件系统的任何地方./MyApp,它的工作原理。因此,我认为我的系统上安装的Nuget软件包作为开发系统仍然可以访问,而新用户的系统则不然。我还没有找到任何与Mac发行有关的文档。我现在唯一能想到的就是分发项目文件,并指示用户运行:

dotnet run -p MyApp.csproj

如果我理解正确,将安装nuget包。

我也可以让用户使用:

dotnet MyApp.dll

我在google搜索中看到了这种形式。这引起了他们的质疑,但是为什么会生成可执行文件。乞丐不能选择,如果这样做dotnet <dll>我很高兴,我只需要让它运行。

我必须在这里找到一些东西,否则netcore2.0应用程序的这个细节,分布只是被忽略了?

在挖掘更多这个似乎也是一个有用的命令:

dotnet publish -c Release --framework netcoreapp2.0 --runtime osx.10.11-x64

并且它还添加了各种DLL和所有依赖DLL。像publish这样的词让我觉得这是他们需要的方式。

这两个链接是我主要获取我的信息的地方:

https://docs.microsoft.com/en-us/dotnet/core/deploying/deploy-with-cli https://docs.microsoft.com/en-us/dotnet/core/tools/project-json-to-csproj

macos .net-core .net-standard .net-standard-2.0
2个回答
14
投票

你对buildpublish之间的区别有正确的直觉。

dotnet build将为当地发展建立申请。一个方面是构建将假设所有依赖关系都可通过本地nuget缓存获得。

dotnet publish将构建应用程序以部署到其他计算机。这明确地处理依赖关系。

有两种发布模式:自包含部署和依赖于框架的部署。

依赖于框架的部署依赖于系统上已存在的框架。如果以此模式发布应用程序,则只包括应用程序及其依赖项。

要在FDD中发布,请使用:

dotnet publish -c Release --framework netcoreapp2.0

相比之下,自包含部署将包括整个.NET Core运行时以及您的应用程序及其依赖项。

要发布SCD,请使用:

dotnet publish -c Release --framework netcoreapp2.0 --runtime osx-x64

(顺便说一句,请使用更一般的osx-x64而不是非常具体的osx.10.11-x64

你看到两种出版方式的区别吗?它只是运行时ID的存在/不存在。在您的示例中,当您使用--runtime标志时,您要求将您的应用程序发布为SCD,最终包括所有.NET Core运行时。只要把它拿出来你应该得到你期望的。

将应用程序发布为FDD时,应在源代码中看到名为bin/Release/netcoreapp2.0/publish的目录。使用该目录(而不是bin/Release/netcoreapp2.0/)作为发布存档。您的用户应该只运行dotnet ./path/to/publish/MyApp.dll

有关更多信息,请查看https://docs.microsoft.com/en-us/dotnet/core/deploying/


0
投票

它仍然可以追溯到他最初的观察,即我看到,可执行的'MyApp'不是真正独立的二进制文件。如果您将该二进制文件移动到另一个目录,它会抱怨它无法找到MyApp.dll。

特别是我使用的命令是:

dotnet new console
dotnet publish -c Release --runtime osx.10.12-x64 --self-contained true

我有同样的问题,我的'MyApp'真的不是一个自包含的应用程序。事实上,我发现'MyApp'至少需要它所在目录中的以下文件:

MyStatic     ----> my 'exe'                   
MyStatic.dll                    
libhostpolicy.dylib
MyStatic.deps.json              
MyStatic.runtimeconfig.dev.json

任何自包含的二进制文件都不应该要求所有这些垃圾单独运行。

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