如何实现deb包内嵌deb包依赖,终极套娃方案

deb包内嵌依赖可以实现离线安装(无需使用apt下载依赖),牺牲包体积来换取离线环境或网络受限环境下的软件安装的便利

以下是通过安装后执行脚本实现的步骤,注意WORKDIR是打包deb包的目录

# 设置工作目录
WORKDIR=$(mktemp -d)

使用apt下载依赖

apt-get download xxx

首先复制依赖的deb包到一个目录,并复制到deb包的任意目录

# 新建文件夹
mkdir -p "$WORKDIR/build/var/lib/bundled-deps"
# 将依赖拷贝到deb包内
cp *.deb "$WORKDIR/build/var/lib/bundled-deps/"

新建安装后执行脚本,实现在deb安装后自动安装deb内的依赖,安装后清理无用的deb包

POSTINST="$WORKDIR/build/DEBIAN/postinst"
cat > "$POSTINST" <<EOF
#!/bin/bash
# set -e
echo "触发异步依赖安装..."
# 后台进程脱离锁限制
nohup bash -c ' \\
  sleep 3;  # 确保主进程释放锁 \\
  echo "正在安装依赖" >> /var/log/bundled-deps.log; \\
  cd /var/lib/bundled-deps/; \\
  for deb in *.deb; do \\
    if [ -f "\$deb" ]; then \\
      dpkg -i "\$deb" || apt-get install -y -f; \\
    fi; \\
  done; \\
  rm -rf /var/lib/bundled-deps/; \\
  echo "依赖安装完成" >> /var/log/bundled-deps.log; \\
' >/dev/null 2>&1 &
EOF
chmod +x "$POSTINST"

然后构建出新的deb包即可分发

注意,该方案十分繁琐,请权衡包体积等因素,根据实际需求选择使用。

好,听说新发布的软件多采用这种方式。

1 个赞