.NET 应用打包Debian包

代码发布(编译为自包含的可执行文件,ARM64)

项目文件是 myproject.FaceCollect.csproj,发布后生成的可执行文件名称为 facecollect。在项目根目录执行:

1
2
3
4
5
6
7
dotnet publish myproject.FaceCollect.csproj \
-c Release \
-r linux-arm64 \
-p:PublishSingleFile=true \
-p:PublishTrimmed=false \
-p:AssemblyName=facecollect \
-o publish
  • -c Release 指定发布模式为 Release。
  • -r linux-arm64 指定目标运行环境为 Linux ARM64。
  • -p:PublishSingleFile=true 表示发布为单文件可执行程序。
  • -p:PublishTrimmed=false 是否裁剪程序集可根据实际需求选择(如果使用了动态反射较多,建议先关闭裁剪)。
  • -p:AssemblyName=facecollect 让生成的可执行文件名为 facecollect。
  • -o publish 指定输出目录。

发布成功后,publish 目录下会生成一个可执行文件 facecollect 以及一些运行所需文件(如果不是单文件,还有其他依赖文件)。

准备打包目录结构

创建一个临时打包工作目录(这里示例版本设为 1.0.0,可根据实际情况修改):

1
mkdir facecollect_1.0.0_arm64

在该目录下按照 Debian 打包规范创建必要的目录结构:

1
2
3
4
5
6
7
8
9
10
11
12
cd facecollect_1.0.0_arm64

# 1) DEBIAN 目录:用于存放控制文件与脚本
mkdir DEBIAN

# 2) 程序安装路径目录:这里放在 /usr/local/facecollect 下
mkdir -p usr/local/facecollect

# 3) systemd 服务文件放在 /etc/systemd/system
mkdir -p etc/systemd/system

cd ..

拷贝发布产物到对应目录

将上一步生成的 publish 文件夹内容拷贝到 usr/local/facecollect 目录下:

1
cp -r publish/* facecollect_1.0.0_arm64/usr/local/facecollect

如果你已经把主可执行文件命名为 facecollect,可以给它加执行权限(有时编译生成默认已有执行权限):

1
chmod +x facecollect_1.0.0_arm64/usr/local/facecollect/facecollect

编写 systemd 服务文件

facecollect_1.0.0_arm64/etc/systemd/system/ 下创建服务文件 facecollect.service,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bashCopy codecat << EOF > facecollect_1.0.0_arm64/etc/systemd/system/facecollect.service
[Unit]
Description=FaceCollect Service
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/facecollect/facecollect
WorkingDirectory=/usr/local/facecollect
Restart=always
User=root
Group=root

[Install]
WantedBy=multi-user.target
EOF
  • ExecStart 指向可执行文件的绝对路径。
  • WorkingDirectory 指定工作目录(可根据需要调整)。
  • User=root / Group=root 指定以 root 身份运行(如需以其他用户运行可自行修改)。
  • Restart=always 确保服务异常退出时自动重启。
  • WantedBy=multi-user.target 配合 systemctl enable 实现开机自启动。

编写 DEBIAN 控制文件

创建控制文件 control(示例):

1
2
3
4
5
6
7
8
9
10
bashCopy codecat << EOF > facecollect_1.0.0_arm64/DEBIAN/control
Package: facecollect
Version: 1.0.0
Section: base
Priority: optional
Architecture: arm64
Essential: no
Maintainer: Jonty <jonty.wang>
Description: FaceCollect .NET Service
EOF
  • Package 包名称。
  • Version 包版本。
  • Architecture 架构为 arm64
  • Maintainer 维护者信息,随意填写或按需填写。
  • Description 包描述。

编写安装后脚本(postinst)

在安装完成后自动执行一些操作,比如 systemctl daemon-reloadsystemctl enablesystemctl start
DEBIAN 目录下创建 postinst

1
2
3
4
5
6
7
8
9
10
11
12
13
cat << 'EOF' > facecollect_1.0.0_arm64/DEBIAN/postinst
#!/bin/bash
set -e

# 重新加载 systemd 配置
systemctl daemon-reload

# 开机自启动并立即启动
systemctl enable facecollect
systemctl start facecollect

exit 0
EOF

给脚本加执行权限:

1
chmod +x facecollect_1.0.0_arm64/DEBIAN/postinst

也可以根据需要添加 preinstprermpostrm 等脚本进行安装前/卸载前/卸载后等自定义操作。

生成 DEB 包

facecollect_1.0.0_arm64 同级目录下执行:

1
dpkg-deb --build facecollect_1.0.0_arm64

成功后,会在当前目录下生成一个名为 facecollect_1.0.0_arm64.deb 的安装包。

安装并验证服务

facecollect_1.0.0_arm64.deb 拷贝到目标机器(ARM64 Linux)上,然后执行:

1
sudo dpkg -i facecollect_1.0.0_arm64.deb

如果安装过程无异常,会自动执行以下操作:

  • 安装程序到 /usr/local/facecollect
  • 安装服务文件到 /etc/systemd/system/facecollect.service
  • 执行 postinst 脚本,启用并启动服务

安装完成后,可以用以下命令验证服务状态:

1
systemctl status facecollect

如果状态显示为 **active (running)**,则表示已经成功运行。

其他操作

  • 启动服务

    1
    systemctl start facecollect
  • 停止服务

    1
    systemctl stop facecollect
  • 查看日志

    1
    journalctl -u facecollect -f
  • 卸载

    1
    sudo dpkg -r facecollect

    若还要清理所有配置文件,可用 dpkg -P facecollect