将.Net Core控制台应用程序部署到Debian服务器

6

我需要将一个简单的 .Net Core 控制台应用程序部署到 Linux 服务器,但遇到了一些问题。

我是这样创建一个简单的控制台 Hello World 应用程序的:

dotnet new console -o hello

然后我在我的开发电脑上测试了这个应用程序。

dotnet run

它正常运作。

接下来,我以这种方式在 Debian 平台上创建了发布版:

dotnet publish -c release -r debian.8-x64 --self-contained

现在我有一个分发文件夹。
C:\Projects\C#\hello\bin\MCD\release\netcoreapp2.0\debian.8-x64

我将debian.8-x64文件夹复制到了我的Debias 8操作系统的Linux计算机上。

找到要执行的文件(~/debian.8-x64/hello)并更改其模式。

chmod +x ./hello

现在我正在尝试执行文件。

./hello 

并且出现了异常

root@my2ndbox:/home/alex/temp/debian.8-x64# ./hello
Error:
  An assembly specified in the application dependencies manifest (hello.deps.json) was not found:
    package: 'runtime.linux-x64.Microsoft.NETCore.App', version: '2.0.0'
    path: 'runtimes/linux-x64/lib/netcoreapp2.0/Microsoft.CSharp.dll'

在Linux机器上安装与我的开发计算机上相同版本的Net Framework。

root@my2ndbox:/home/alex/temp/debian.8-x64# dotnet --version
2.0.2

什么可能导致这种类型的错误?

1
似乎缺少一个库,Microsogy.CSharp.dll。它可能没有被复制。你有找过它吗? - Frido Emans
据我所知,如果使用自包含文件,则最终机器上无需安装框架。所有 DLL 文件必须位于您的 /hello 目录中。 - Vasek
3个回答

5
您正在复制错误的内容进行部署。当您使用 dotnet publish 时,应该使用 publish 目录下的内容。对于您的情况,应该是 release/netcoreapp2.0/debian.8-x64/publish/
如果您使用非发布目录(release/netcoreapp2.0/debian.8-x64/),它会认为您想在开发模式下运行项目,并期望使用来自本地 nuget 缓存的资源,这在部署机器上很可能会缺失。
顺便说一句,您做了一些非常奇怪的事情。首先,您需要决定是否真的要使用自包含部署。如果是这样,那么您甚至不需要在您尝试部署的机器上安装 dotnet。

非常感谢您的解释并指导我发布目录。我也复制了它,但应用程序在其外部,因为它看到文件 hello 也在其外部。现在一切都正常工作。 - Alex Zhulin

4
您可能还想查看 dotnet-packaging。它包括一个命令行实用程序dotnet deb,允许您创建一个.deb文件(即Debian安装程序),您可以使用它来在Debian上安装您的应用程序。这将使部署变得更加容易。
要开始,请首先将以下内容添加到您的.csproj文件中:
<ItemGroup>
  <PackageReference Include="Packaging.Targets" Version="0.1.45" />
  <DotNetCliToolReference Include="dotnet-deb" Version="0.1.45" />
<ItemGroup>

然后,运行dotnet restoredotnet deb -c Release -r debian.8-x64 -f netcoreapp2.0。这将创建一个.deb文件,您可以使用它来部署应用程序到Debian。


-1

--self-contained 的意思是你不需要在目标机器上安装 .Net Core,因为所有所需的组件都在发布文件夹中

第二个问题是重复参数。因为将 -r debian.8-x64 设置为 true,就相当于设置了 --self-contained (换句话说,在设置运行时标识后,你不再需要 --self-contained

最后,在发布之前尝试执行 dotnet restore。然后确保从 ./bin/[configuration]/[framework]/[runtime] 复制正确的文件(./bin/[configuration]/[framework]/ 是针对基于框架的部署的)。你甚至可以通过参数 -o 自己设置输出文件夹(例如 dotnet publish -c release -r debian.8-x64 -o copyme 并将 copyme 复制到你的 "Linux 服务器")


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接