我正在使用Visual Studio for Mac
,我的应用程序是写的,它做我想要的。用户的目标平台是OSX。它依赖于2个具有自己依赖关系的Nuget包,具体来说:
我运行以下命令到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'
现在,AsyncIO
是NetMQ
的依赖,所以它就是来自的地方。但是,我可以从我的文件系统的任何地方./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
你对build
和publish
之间的区别有正确的直觉。
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/。
它仍然可以追溯到他最初的观察,即我看到,可执行的'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
任何自包含的二进制文件都不应该要求所有这些垃圾单独运行。