Skip to content

makeself 自解压打包:把整个目录打成单个 run 文件 ​

交付一个命令行工具,往往不止一个可执行文件——还有启动脚本、配置模板、动态库。makeself 能把整个目录打包成单个可执行的自解压脚本(通常以 .run 为扩展名),用户拿到一个文件、赋权限、直接运行即可完成部署。这篇文章覆盖打包命令、用户侧使用、校验机制和它的工作原理。

安装 ​

bash
# Debian / Ubuntu
sudo apt update && sudo apt install -y makeself

# Fedora / RHEL
sudo dnf install makeself

准备分发内容 ​

创建独立的分发目录,放入全部交付物:

bash
mkdir -p dist
cp build/bin/executable_binary dist/
cp build/bin/startup_script.sh dist/
chmod +x dist/executable_binary dist/startup_script.sh

注意二进制文件要与目标平台架构匹配,不同架构需分别打包。

打包 ​

bash
makeself dist/ package.run "Package Description" ./startup_script.sh

参数依次是:归档目录、输出文件名、描述标签、启动脚本(相对归档目录)。运行 package.run 时,解压完成后会自动执行这个启动脚本。

常用选项:

  • --follow:跟随符号链接(默认不跟随);
  • --nox11:不自动调用 X11,纯命令行工具建议加上;
  • --lsm file.lsm:附加元数据文件。

带版本与元数据的完整示例:

bash
makeself --follow --nox11 --lsm package.lsm dist/ package-1.0.0.run "Tool v1.0.0" ./startup_script.sh

LSM(Linux Software Map)文件示例:

Title:           My Command Line Tool
Version:         1.0.0
Description:     A sample CLI tool for demonstration
Author:          Your Name
Platforms:       Linux x86_64
Copying-policy:  Proprietary

用户侧使用 ​

终端用户只需要两步:

bash
chmod +x package.run
./package.run

自解压包还内置了一组验证与调试命令:

bash
./package.run --check    # 校验包完整性
./package.run --keep     # 运行后保留临时解压目录(调试用)
./package.run --list     # 列出包内文件
./package.run --target /custom/path  # 指定解压路径

--check 的校验机制 ​

--check 校验的是打包时嵌入的校验和:makeself 打包时默认嵌入 MD5(另有 CRC),所以不加任何选项打出的包就能直接 --check;需要更强的完整性校验时,打包时加 --sha256;--nocrc、--nomd5 则禁用对应校验。如果 --check 报 "does not contain an embedded SHA256 checksum" 但 MD5 校验通过,属于正常现象——只是打包时没启用 SHA256。

工作原理 ​

makeself 把一段 Shell 启动脚本与压缩后的归档拼接成单一文件:

  1. 运行时,脚本头部负责校验完整性;
  2. 解压内容到临时目录(默认 /tmp/makeself.XXXXXX);
  3. 自动执行打包时指定的启动脚本;
  4. 执行完成后默认自动清理临时目录。

注意:makeself 不提供加密,包内容可以被解包分析。敏感逻辑应编译为二进制再打包。

注意事项 ​

  • 架构兼容:包内二进制必须与目标系统 CPU 架构一致;
  • 依赖管理:依赖特定系统库时,建议静态链接或在文档中明确说明;
  • 临时目录权限:容器、沙箱等受限环境可能无 /tmp 写权限,可用 --target 指定解压路径;
  • 安全边界:自解压内容可被提取分析,不适合保护高价值知识产权。

与 shc 的选型 ​

和 shc 将 Shell 脚本编译为二进制相比,两者分工不同:shc 对单个脚本做基础混淆,makeself 对整个目录做整洁交付但不隐藏内容。组合用法是先用 shc 处理启动脚本,再用 makeself 打包。

更广泛的场景可以再对比两条路:AppImage 适合跨发行版桌面应用但需要 FUSE;自制 tar.gz + installer 完全可控,但要自己处理错误恢复与清理。

小结 ​

makeself 一条命令把目录打成自解压 .run,用户侧零依赖、开箱即用,默认嵌入 MD5 校验保证传输完整性。它解决的是分发体验问题而非保密问题——内容是明文的,敏感逻辑先编译为二进制再打包。

最近更新

基于 VitePress 构建