with one click
tar-linyaps
將 Linux binary release tar 歸檔包轉換為玲瓏(Linglong)應用便捷打包腳本。
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
將 Linux binary release tar 歸檔包轉換為玲瓏(Linglong)應用便捷打包腳本。
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
| name | tar-linyaps |
| description | 將 Linux binary release tar 歸檔包轉換為玲瓏(Linglong)應用便捷打包腳本。 |
| user-invocable | false |
將 Linux binary release tar 歸檔包轉換為玲瓏( Linglong)應用便捷打包腳本。
convert tar, tar binary, tar package, 轉換 tar, tar 打包
支持兩種參數傳遞方式(優先級:JSON 配置文件 > 交互式傳參):
通過 JSON 文件一次性提供所有構建參數,由 parse_build_config.sh 腳本解析。
# 解析配置文件,輸出 key=value 格式
eval "$(bash "${skill_root}/scripts/parse_build_config.sh" config.json)"
JSON 結構分為 main(必填)和 optional(可選)兩個分組:
{
"main": {
"src_url": "https://example.com/app-1.0.0.tar.zst",
"app_name": "My Application",
"package_id": "com.example.myapp",
"description": "應用描述",
"icon_url": "https://example.com/icon.png"
},
"optional": {
"binary_name": "myapp",
"app_version": "1.0.0",
"base_id": "org.deepin.base",
"base_version": "25.2.2",
"runtime_id": "org.deepin.runtime.dtk",
"runtime_version": "25.2.2",
"linyaps_arch": "x86_64",
"output_dir": "./output"
}
}
範例文件:examples/build_config.example.json
直接向 Agent 提供以下參數,Agent 交互式收集:
| 參數 | 說明 | 必填 | 範例 |
|---|---|---|---|
src_url | tar 歸檔下載 URL 或本地路徑 | ✅ | https://example.com/app.tar.zst |
app_name | 應用名稱 | ✅ | My Application |
package_id | 玲瓏包 ID(反向域名格式) | ✅ | com.example.myapp |
description | 應用描述 | ✅ | A sample application |
icon_url | icon 下載 URL | ✅ | https://example.com/icon.png |
binary_name | 可執行檔案名 | ❌ | app.bin |
app_version | 版本號 | ❌ | 1.0.0 |
base_id | base 層 ID | ❌ | org.deepin.base |
base_version | base 層版本 | ❌ | 25.2.2 |
runtime_id | runtime 層 ID | ❌ | org.deepin.runtime.dtk |
runtime_version | runtime 層版本 | ❌ | 25.2.2 |
linyaps_arch | 目標架構 | ❌ | x86_64 |
output_dir | 輸出目錄 | ❌ | ./output |
使用 batch_init.sh 腳本可以批量創建多個 tar 應用的打包工程:
# CSV 格式批量初始化
./scripts/batch_init.sh tasks.csv --projects_root=./projects
# JSON 格式批量初始化
./scripts/batch_init.sh task.json --projects_root=./projects
# 僅生成項目結構,不執行打包
./scripts/batch_init.sh tasks.csv --dry-run
CSV 格式示例:
包名,架構,版本,下載地址
com.example.app,x86_64,1.0.0,https://example.com/app.tar.zst
JSON 格式示例:
{
"global": {
"projects_root": "./projects"
},
"tasks": [
{
"pkgName": "com.example.app",
"arch": "x86_64",
"orig_version": "1.0.0",
"src_url": "https://example.com/app.tar.zst"
}
]
}
批量初始化會為每個任務創建 CI_ll_<pkgName> 目錄,包含:
linglong.yaml - 玲瓏打包配置文件pak_linyaps.sh - 自動化打包腳本scripts/ - 輔助腳本目錄config/ - 配置文件目錄(含白名單配置)templates/files_res/ - 資源文件目錄# 驗證 tar 文件格式
file "${tar_path}"
# 在臨時目錄解壓
extract_dir=$(mktemp -d)
tar -xf "${tar_path}" -C "${extract_dir}"
解壓後立即檢查是否存在以下文件,判斷是否為源碼包:
CMakeLists.txtMakefileconfigure.ac*.spec(RPM spec)meson.buildsetup.py若為源碼包:終止並提示用戶這是源碼包,不適用此工具。
若為二進制包:繼續 Step 3。
若用戶提供了 JSON 配置文件(build_config.json),調用解析腳本載入所有參數:
# 解析 JSON 配置,輸出 key=value 格式並載入為 shell 變量
eval "$(bash "${skill_root}/scripts/parse_build_config.sh" build_config.json)"
# 載入後可直接使用以下變量:
# 必填(來自 main):src_url, app_name, package_id, description, icon_url
# 可選(來自 optional):binary_name, app_version, base_id, base_version,
# runtime_id, runtime_version, linyaps_arch, output_dir
解析腳本行為:
main + optional)main 中所有必填欄位是否存在且非空src_url、icon_url)optional 中未填寫的欄位自動使用默認值key=value 格式,可直接 eval 載入解析成功後:根據 binary_name 是否有值決定後續流程:
binary_name 有值 → 直接進入 Step 6binary_name 為空 → 進入 Step 4 掃描 desktop若用戶未提供 JSON 配置文件,Agent 交互式收集參數:
src_url、app_name、package_id、description、icon_url 等必填項binary_name 決定後續流程desktop_files=$(find "${extract_dir}" -name "*.desktop" -type f 2>/dev/null)
Exec= 有值:
Exec= 中的 binary name(優先級高於自動掃描)Icon= 欄位中的 icon 路徑files_res/share/applications/Exec= 無值:
Icon= 欄位中的 icon 路徑files_res/share/applications/app_name、binary_name、app_version 生成 desktop 文件binary_name 是否存在並可執行desktop-file-validate 驗證合規性"${skill_root}/scripts/scan_executables.sh" "${extract_dir}"
*.so 文件file 命令檢測 ELF 二進制架構,與 uname -m 比較,架構不匹配的自動跳過參考 linglong-fix 技能的 fix_icon_directory_structure 和 fix_desktop_icon 邏輯,
確保圖標目錄結構和 desktop Icon= 欄位符合 XDG 圖標主題規範。
優先級:
Icon= 欄位提取:解析 Icon 值,在 tar 解壓目錄中查找對應文件find "${extract_dir}" -type f \( -name "*.png" -o -name "*.svg" -o -name "*.xpm" \)--icon-url:下載圖標文件失敗處理:以上均未找到有效 icon → 任務終止並報錯
將找到的圖標文件放置到符合 XDG 圖標主題規範的目錄結構中:
files_res/share/icons/hicolor/
├── scalable/apps/ ← SVG 圖標
├── 128x128/apps/ ← PNG 圖標(默認尺寸)
├── 256x256/apps/
└── ...
放置規則(參考 linglong-fix 的 fix_icon_directory_structure):
| 格式 | 目標目錄 | 說明 |
|---|---|---|
.svg | hicolor/scalable/apps/ | 矢量圖標統一放入 scalable |
.png | hicolor/<size>/apps/ | 根據實際尺寸或文件名判斷 |
.xpm | hicolor/<size>/apps/ | 同 PNG 處理 |
尺寸判斷:
file 命令讀取實際尺寸(如 file icon.png → PNG image data, 256 x 256)identify(ImageMagick)讀取尺寸128x128/apps/XDG 標準尺寸:16x16, 22x22, 24x24, 32x32, 48x48, 64x64, 128x128, 256x256, 512x512, scalable
參考 linglong-fix 的 fix_desktop_icon,將 desktop 文件的 Icon= 欄位統一改為 XDG 規範名稱:
| 原始值 | 修正後 | 說明 |
|---|---|---|
Icon=/usr/share/icons/hicolor/256x256/apps/myapp.png | Icon=myapp | 絕對路徑 → 名稱 |
Icon=./icons/myapp.svg | Icon=myapp | 相對路徑 → 名稱 |
Icon=myapp | Icon=myapp | 已符合規範,不變 |
注意:此步驟在 Step 4 複製 desktop 文件之後執行,確保 desktop 文件中的 Icon 欄位與實際圖標文件名一致。
調用 linglong-project-gen 子技能創建工程:
# 工程目錄命名
project_dir="CI_ll_${package_id}"
mkdir -p "${project_dir}/templates/files_res"
mkdir -p "${project_dir}/scripts"
mkdir -p "${project_dir}/config"
# 拷貝模板
cp "${skill_root}/templates/pak_linyaps.sh" "${project_dir}/"
chmod +x "${project_dir}/pak_linyaps.sh"
cp "${skill_root}/templates/linglong.yaml" "${project_dir}/templates/"
# 預填充已知值到模板 YAML(Step 3 已收集的靜態信息,避免佔位符殘留)
sed -i "s|\${package_id}|${package_id}|g" "${project_dir}/templates/linglong.yaml"
sed -i "s|\${app_name}|${app_name}|g" "${project_dir}/templates/linglong.yaml"
sed -i "s|\${description}|${description}|g" "${project_dir}/templates/linglong.yaml"
# 拷貝掃描腳本
cp "${skill_root}/scripts/scan_executables.sh" "${project_dir}/scripts/"
chmod +x "${project_dir}/scripts/scan_executables.sh"
# 拷貝路徑處理腳本(與 deb 版共用,處理 /usr/、/opt/ 等路徑轉換 + 特殊字符標準化)
cp "${skill_root}/../linglong-project-gen/templates/scripts/handle_special_paths.sh" "${project_dir}/scripts/"
chmod +x "${project_dir}/scripts/handle_special_paths.sh"
# 拷貝白名單配置
cp "${skill_root}/../config/base_runtime_whitelist.conf" "${project_dir}/config/"
# 拷貝 desktop 文件
cp "${desktop_file}" "${project_dir}/templates/files_res/share/applications/"
# 拷貝 icon 文件
if [ -n "${icon_file}" ] && [ -f "${icon_file}" ]; then
mkdir -p "${project_dir}/templates/files_res/share/icons/hicolor/"
cp "${icon_file}" "${project_dir}/templates/files_res/share/icons/hicolor/"
fi
注意:
package_id 從 app_name 推導(反向域名格式,如 com.example.app)command 欄位占位符由 pak_linyaps.sh 在構建時自動處理base/runtime 欄位為空佔位符 "",由 build_pak() 透過 sed 延遲注入Exec= 欄位| 階段 | 負責方 | 操作 |
|---|---|---|
| Step 2: 源碼包檢測 | tar-linyaps skill | 解壓後立即檢測,源碼包則終止 |
| Step 4: Desktop 掃描 | tar-linyaps skill | 提取 Exec= binary name(優先級高於自動掃描) |
| Step 5: 自動掃描 | tar-linyaps skill | 僅在無 desktop Exec 時掃描可執行檔 |
| Step 4/5: 資源收集 | tar-linyaps skill | 只修復 Icon 路徑,不修改 Exec 欄位 |
| Step 7: 工程生成 | tar-linyaps skill | 準備 templates/、scripts/、config/ 目錄結構 |
| 構建時 | pak_linyaps.sh | 創建 wrapper 腳本(binary/bin/*.wrapper) |
| 構建時 | pak_linyaps.sh | 更新 linglong.yaml 的 command(sed 替換為數組格式) |
| 構建時 | pak_linyaps.sh | 更新 linglong.yaml 的 base/runtime(sed 延遲注入) |
| 構建時 | pak_linyaps.sh | 更新 desktop 的 Exec(替換為 wrapper 絕對路徑) |
| 構建時 | pak_linyaps.sh | Desktop 文件去重(dedup_desktop_files.sh 兩步去重) |
| 構建時 | pak_linyaps.sh | 嵌套 bin/ 路徑驗證(validate_bin_nesting.sh) |
| 構建時 | pak_linyaps.sh | ll-builder build — 實際構建玲瓏包 |
| 構建時 | pak_linyaps.sh | ll-builder export — 導出 .layer 文件到 output_dir |
| 構建時 | pak_linyaps.sh | 可選 ll-builder push(auto_push=true 時) |
pak_linyaps.sh 是完整構建腳本(非僅工程目錄生成器),與 deb 版構建流程完全一致。
main()
├─ init_global_data() # 解析命令行參數
├─ data_regroup_check() # 驗證 src_path、版本處理、輸出目錄
├─ build_dir_init() # 準備構建環境
│ ├─ 複製 files_res/ 到 build_tmp_dir
│ ├─ 複製 scripts/*.sh 到 build_tmp_dir/scripts/
│ └─ envsubst 生成 linglong.yaml
├─ build_pak() # 核心構建
│ ├─ tar -xf 解壓
│ ├─ handle_special_paths.sh 路徑轉換
│ ├─ 自動偵測 binary_name(desktop → scan_executables.sh)
│ ├─ 創建 wrapper 腳本(binary/bin/*.wrapper)
│ ├─ 更新 linglong.yaml command + base/runtime + desktop Exec
│ ├─ dedup_desktop_files.sh 兩步去重
│ ├─ validate_bin_nesting.sh 嵌套 bin/ 驗證
│ ├─ 創建 .linyaps_genius 標識文件
│ ├─ ll-builder build --skip-output-check
│ ├─ ll-builder export --no-develop --layer
│ └─ 移動 *.layer 到 output_dir
├─ push_dev() [可選] # ll-builder push 到倉庫
└─ 清理 build_tmp_dir
output_dir/ 下生成 *.binary.layer 文件ll-builder build 返回非零退出碼,腳本終止模板中的 build: 段負責將文件複製到玲瓏容器內:
build: |
cp -rf /project/binary/* ${prefix}/
cp -rf /project/files_res/* ${prefix}/
touch ${prefix}/.linyaps_genius
linglong.yaml 模板中 base: "", runtime: "" 為空佔位符,由 build_pak() 透過 sed 延遲注入,支援 --base_id/--runtime_id CLI 參數動態覆蓋Exec= 欄位.sh wrapper 文件pak_linyaps.sh 的 wrapper 機制在構建時自動完成Exec= 欄位.sh wrapper 文件pak_linyaps.sh 的 wrapper 機制在構建時自動完成linglong.yaml 模板中 base: "", runtime: "" 為空佔位符build_dir_init() 中 export base=/runtime= 變量build_pak() 在構建時透過 sed 延遲注入--base_id/--runtime_id CLI 參數動態指定ll-builder 或修改構建流程bash pak_linyaps.sh --src_path ... --package_id ... 後,腳本自動完成從解壓到 .layer 導出的全部流程,無需手動干預build_tmp_dir 作為構建沙箱,所有中間產物在其中生成,構建完成後可自動清理parse_build_config.sh:JSON 配置解析腳本(解析 build_config.json,驗證必填欄位,輸出 key=value 格式)scan_executables.sh:可執行檔掃描腳本(tar 版特有,用於無 desktop 時的自動偵測)handle_special_paths.sh:路徑轉換腳本(處理 /usr/、/opt/ 等路徑層級剝離 + 特殊字符標準化 + 軟鏈修復),與 deb 版共用dedup_desktop_files.sh:Desktop 文件去重腳本(兩步去重:binary vs files_res + files_res 內部),與 deb 版共用validate_bin_nesting.sh:嵌套 bin/ 路徑驗證腳本,與 deb 版共用jq:JSON 解析工具(parse_build_config.sh 依賴)ll-builder:玲瓏構建工具(build + export + push)desktop-file-validate:desktop 文件驗證工具envsubst:環境變量替換工具(生成 linglong.yaml)examples/build_config.example.json:JSON 配置範例文件(main/optional 分組結構)base_runtime_whitelist.conf:base/runtime 白名單配置templates/linglong.yaml:玲瓏工程模板(含 build 段)根据deb包信息和CSV配置,生成完整的玲珑打包工程,包括 linglong.yaml 配置文件和 pak_linyaps.sh 打包脚本。
从deb包解压后的目录中提取应用资源文件(desktop文件、图标、appdata、补全脚本等), 按照玲珑打包规范整理到 files_res/ 目录结构中。
执行玲珑打包构建测试,验证生成的工程是否可以正常构建, 并运行兼容性检测确保应用能在玲珑环境中正常运行。
解析Debian软件包(.deb)文件,提取元数据信息并解压文件内容, 为后续玲珑打包工程生成提供基础数据。
根据验证报告自动修复玲珑构建项目中的问题, 包括linglong.yaml格式、desktop文件、图标目录结构、二进制文件权限等。
验证玲珑打包项目目录结构和必要文件的完整性。支持通过JSON配置文件自定义检查规则, 包括目录存在性、文件存在性、通配符匹配数量、脚本可执行权限等。