.NET Core Web API发布至Ubuntu服务器依赖缺失问题求助
嘿,作为C#新手碰到这种依赖找不到的问题太正常了,我来帮你一步步搞定~
首先得搞明白为啥会出现这个错误:你以为依赖会直接编译进.dll里,但其实.NET Core的发布机制不是这样的,它默认会把依赖项和你的应用代码分开管理,通过api.deps.json这个清单文件来记录需要的依赖包信息。如果服务器上找不到对应的依赖包,就会抛出你看到的那个错误。下面给你几个靠谱的解决办法:
方法一:用独立部署(Self-Contained)打包所有依赖
这个方法最适合新手,因为它会把.NET Core运行时(Runtime)和所有依赖包一起打包到发布目录里,不需要服务器提前安装.NET Core环境,上传就能跑。
执行发布命令:
dotnet publish -c Release -r ubuntu-x64 --self-contained true
参数解释:
-c Release:发布正式版本(比Debug版本更高效)-r ubuntu-x64:指定目标运行环境是64位Ubuntu(如果你的服务器是32位,改成ubuntu-x86)--self-contained true:告诉编译器把运行时和所有依赖都打包进来
发布完成后,找到项目目录下bin/Release/netX.x/ubuntu-x64/publish这个文件夹,把里面所有文件和文件夹都上传到Ubuntu服务器。然后给生成的可执行文件加执行权限:
chmod +x 你的应用名称
最后直接运行就行:
./你的应用名称
方法二:框架依赖部署(Framework-Dependent)
如果你希望服务器上共享.NET Core运行时,减小发布包大小,可以用这种方式,但需要确保服务器已经安装了对应版本的.NET Core Runtime。
- 先在Ubuntu服务器上安装.NET Core Runtime:
打开终端执行对应版本的安装命令(比如.NET 6):sudo apt update && sudo apt install -y dotnet-runtime-6.0 - 本地发布命令:
dotnet publish -c Release - 同样要把
bin/Release/netX.x/publish目录下的所有内容上传到服务器,不要只传单个.dll文件! - 运行应用:
dotnet 你的应用名称.dll
方法三:单文件发布(更省心的方式)
如果你想只生成一个文件上传到服务器,.NET Core 3.0及以上版本支持单文件发布,它会把所有内容打包成一个单独的可执行文件:
发布命令:
dotnet publish -c Release -r ubuntu-x64 --self-contained true /p:PublishSingleFile=true
发布完成后,你会得到一个单独的可执行文件,上传到服务器后加执行权限就能直接运行,超级方便!
关键提醒
你之前可能只传了单个.dll文件到服务器,这绝对不行!.NET Core应用需要api.deps.json、api.runtimeconfig.json这些配置文件,还有依赖包所在的refs、runtimes文件夹,这些都是运行必需的,一定要把整个发布目录的内容都传上去。
内容的提问来源于stack exchange,提问作者recursivePython

