如何在使用dh-virtualenv构建的Debian包中包含Python应用源代码?
我明白你的需求——dh-virtualenv确实擅长把Python应用和依赖打包成独立虚拟环境,但默认不会包含原始源代码,而你需要在部署时做插值操作。stdeb没法处理虚拟环境依赖的问题确实头疼,下面给你一套可行的解决方案:
核心思路
dh-virtualenv基于Debian的dh工具链,我们可以通过添加dh的安装规则,把需要的源代码/模板文件额外打包到指定路径,同时保留虚拟环境的依赖打包能力。
步骤1:创建/修改debian/install文件
在你的项目根目录的debian文件夹下,创建(如果没有的话)debian/install文件,用来指定要打包的源文件/目录,以及安装后的目标路径。
比如你的源代码在项目根的src/目录,需要放到/usr/share/python/<你的包名>/下,就写:
src/ usr/share/python/<your-package-name>/
如果还有需要插值的模板目录(比如templates/),也一起加进去:
src/ usr/share/python/<your-package-name>/ templates/ usr/share/python/<your-package-name>/
注意:这里的源路径是相对于项目根目录的,目标路径是相对于Deb包的安装根(也就是最终的
/目录)。
步骤2:确保debian/rules配置正确
你的debian/rules应该已经包含dh-virtualenv的配置,通常是这样的:
#!/usr/bin/make -f %: dh $@ --with python-virtualenv
不需要做额外修改,dh工具会自动读取debian/install里的规则,把指定文件打包进去。
步骤3:排除规则检查
检查debian/exclude文件(如果存在的话),确保里面没有排除你要打包的目录(比如不要有src/或templates/这样的行),否则这些文件会被跳过打包。
步骤4:(可选)部署时的插值脚本
如果需要在安装后自动执行插值操作,可以创建debian/postinst脚本(记得给它加可执行权限:chmod +x debian/postinst),比如:
#!/bin/sh set -e # 示例:将模板文件插值后复制到虚拟环境的应用目录 TEMPLATE_PATH="/usr/share/python/<your-package-name>/templates/config.tpl" TARGET_PATH="/usr/share/python/<your-package-name>/venv/lib/python3.10/site-packages/your_app/config.py" # 这里替换成你的插值逻辑,比如用envsubst替换变量 envsubst < "$TEMPLATE_PATH" > "$TARGET_PATH"
注意:虚拟环境里的Python版本路径(比如
python3.10)要根据你构建时的环境调整,或者用通配符python*来适配不同版本。
步骤5:测试构建与验证
运行构建命令:
dpkg-buildpackage -us -uc
构建完成后,用以下命令检查Deb包内容,确认源代码是否被包含:
dpkg -c <your-package-name>_*.deb
安装包后,直接查看/usr/share/python/<your-package-name>/目录,就能看到你需要的源代码文件了。
额外注意事项
- 虽然你知道这种做法不符合Debian规范,但还是建议尽量只打包需要插值的模板文件,而不是整个源代码目录,减少包体积和不必要的文件暴露。
- 如果你的应用需要在代码中访问这些文件,可以在代码里通过绝对路径或者环境变量获取,比如:
import os SOURCE_DIR = os.environ.get("APP_SOURCE_DIR", "/usr/share/python/<your-package-name>") template_path = os.path.join(SOURCE_DIR, "templates", "config.tpl")
内容的提问来源于stack exchange,提问作者armak

