Linux 下的 .run 自执行安装包(适配 ROS Noetic 等场景),核心思路是将安装脚本、待安装文件打包成「自解压 shell 脚本」 ------ 本质是把「解压逻辑 + 自定义安装逻辑」写到一个脚本里,最终生成可执行的 .run 文件。下面给出通用、可落地的制作步骤
一、核心原理(通俗理解)
.run 文件 = 自解压脚本 + 压缩的安装文件(二进制/配置/依赖)
运行 .run 时,脚本先自动解压内部文件,再执行你写的安装逻辑(复制文件、配置环境、创建快捷方式等),全程无需手动解压。
二、制作步骤(分 4 步,ROS 场景示例)
以「制作一个 ROS 工具的 .run 安装包」为例,假设待安装的内容是:
工具二进制文件:~/ros_tool/bin/my_ros_tool
配置文件:~/ros_tool/config/tool_config.yaml
安装脚本:install.sh(自定义安装逻辑)
步骤 1:整理安装文件结构
先把所有待安装的文件 / 脚本放到一个统一目录,方便打包:
cpp
# 创建工作目录
mkdir -p ~/ros_run_builder/{src,dist}
# src:存放待安装的文件+安装脚本;dist:存放最终生成的.run文件
cd ~/ros_run_builder/src
# 复制待安装文件到src目录(按你的实际路径修改)
cp -r ~/ros_tool/bin ./
cp -r ~/ros_tool/config ./
# 创建核心安装脚本 install.sh(关键!自定义安装逻辑)
vim install.sh
写入以下安装逻辑(适配 ROS Noetic,可按需修改):
cpp
#!/bin/bash
# install.sh - ROS 工具安装脚本
set -e # 出错立即退出
# 定义安装路径(可让用户自定义,这里默认安装到 /opt/ros/noetic/tools)
INSTALL_DIR="/opt/ros/noetic/tools"
echo "开始安装 ROS 工具到:$INSTALL_DIR"
# 1. 创建安装目录
mkdir -p $INSTALL_DIR/{bin,config}
# 2. 复制文件到安装目录
cp -r bin/* $INSTALL_DIR/bin/
cp -r config/* $INSTALL_DIR/config/
# 3. 添加可执行权限
chmod +x $INSTALL_DIR/bin/my_ros_tool
# 4. 配置 ROS 环境(可选,让用户无需手动配)
echo "export PATH=\$PATH:$INSTALL_DIR/bin" >> ~/.bashrc
echo "export ROS_TOOL_CONFIG=$INSTALL_DIR/config/tool_config.yaml" >> ~/.bashrc
# 5. 提示安装完成
echo "✅ ROS 工具安装完成!执行 source ~/.bashrc 生效环境变量"
步骤 2:编写自解压脚本(核心模板)
在 ~/ros_run_builder/src 目录下创建 self_extract.sh(自解压核心逻辑):
cpp
vim self_extract.sh
写入通用自解压模板(无需修改,直接复用):
cpp
#!/bin/bash
# self_extract.sh - 自解压脚本模板
set -e
# 1. 定义分隔符(必须唯一,建议用随机长字符串)
DELIMITER="=====ROS_RUN_DELIMITER_2026====="
# 2. 解压逻辑:找到分隔符位置,解压后面的压缩内容
ARCHIVE_START=$(awk "/^$DELIMITER$/ {print NR + 1; exit}" $0)
tail -n +$ARCHIVE_START $0 | tar zxvf -
# 3. 进入解压后的目录,执行安装脚本
cd ./ros_tool_files
chmod +x install.sh
./install.sh
# 4. 清理临时文件(可选)
cd ..
rm -rf ./ros_tool_files
# 5. 结束
echo "📦 安装包执行完成!"
exit 0
# 分隔符(必须单独一行)
$DELIMITER
步骤 3:打包生成 .run 文件
将「自解压脚本 + 压缩的安装文件」合并,生成最终的 .run 文件:
cpp
cd ~/ros_run_builder/src
# 1. 压缩待安装文件(包括install.sh)到 tar.gz 包
tar zcf ros_tool_files.tar.gz bin/ config/ install.sh
# 2. 合并自解压脚本 + 压缩包 → 生成.run文件
cat self_extract.sh ros_tool_files.tar.gz > ../dist/ros_tool_install.run
# 3. 赋予.run文件执行权限
chmod +x ../dist/ros_tool_install.run
# 最终生成的安装包路径:~/ros_run_builder/dist/ros_tool_install.run
步骤 4:测试 .run 安装包
cpp
# 切换到dist目录,运行安装包
cd ~/ros_run_builder/dist
./ros_tool_install.run
# 验证安装结果
source ~/.bashrc
my_ros_tool --version # 能执行则说明安装成功