Pier 软件包管理器:终极技术白皮书

一、 序言:为什么要有 Pier?

在 Windows 的世界里,安装软件通常意味着:双击 .exe -> 下一步 -> 下一步 -> 忍受广告 -> 注册表被塞满。
虽然有像 Scoop 或 Winget 这样的现代管理器,但它们往往需要复杂的运行环境(如 PowerShell 策略或 .NET)。

Pier 的哲学是:回归原始。
它诞生于一个朴素的想法——能不能只用 Windows 诞生之初就有的“老古董”技术,做一个像 Linux 那样干净、透明、自动化的包管理器?

Pier 的核心定义:

Pier 是一个基于 Batch(批处理) 逻辑内核,通过 HTA(网页程序) 提供交互界面,利用 7z/sed 等工具链实现软件下载、安装、卸载全生命周期管理的生态系统。


二、 Pier 的家族成员

为了让你从零理解,我们把 Pier 比作一个“自动售货机系统”:

  1. 柜台 (pier.bat)
    这是你唯一需要直接打交道的入口。它负责接收你的命令(比如 pier install wechat),然后去后台翻账本、调货。

  2. 账本 (lang.ini & sourceimage.ini)
    记录了机器该说哪国语言,以及去哪个服务器地址下载软件。

  3. 电子显示屏 (install.hta)
    当你准备买东西(安装)时,它会跳出来让你确认价格和信息。

  4. 打包工厂 (PierPacker)
    这是生产商使用的工具。它负责把散装的程序零件(文件),封装成 Pier 能识别的“标准易拉罐”(.pie 格式)。


三、 图解:Pier 原理分析

3.1、各种文件是干什么的

3.2、Pier 执行全过程

四、 核心原理:HTA 对话框是如何工作的?

这是 Pier 最亮眼的地方。你看到的那个带有“确认安装”按钮的精美窗口,实际上是一个 HTA (HTML Application)

1. 为什么不直接用 CMD 询问?

CMD 的 set /p 只能输入文字,不能点按钮,更不能显示精美的软件图标和排版。HTA 本质上是一个“拥有本地最高权限的 IE 浏览器渲染窗口”,它能调用 JavaScript 操作文件。

2. 跨进程通信:pier_choice.tmp

这是你代码中最精妙的逻辑。由于批处理无法直接读取网页里的变量,它们通过“写小纸条”的方式通信:

  • 第一步pier.bat 运行 mshta install.hta
  • 第二步:HTA 运行,用户点击“确认”。
  • 第三步:HTA 内部的 JS 代码执行:
    fso.CreateTextFile("%TEMP%\\pier_choice.tmp").Write("Y")
  • 第四步:HTA 关闭,pier.bat 检查 %TEMP% 目录下有没有这个 .tmp 文件。
  • 第五步:读到 Y,继续安装;没读到,直接退出。

3. HTA 界面视觉图

五、 PierPacker:软件是如何被制作出来的?

PierPacker.batBuilder.hta 是 Pier 生态的“生产力工具”。没有它们,开发者就得手动写那些复杂的配置文件。

1. 打包流程分解

当你有一个文件夹(比如绿色版的软件),想把它变成 Pier 格式,你需要经历以下步骤:

  1. 信息采集 (Builder.hta)
    你在界面上填入软件名、版本、作者、Autorun 脚本名称。

  2. 生成 Metadata
    Builder 会在你的源码文件夹里自动生成一个 [软件名].metadata。这个文件是 Pier 安装时的“说明书”。

  3. 物理压缩 (7za.exe)
    PierPacker 会调用后台的 7zip 工具,把文件夹压缩成一个 .pie 后缀的压缩包。

2. PierPacker 架构图

六、 开发者必看:源码中的细节

1. 管理员权限的“静默夺取”

PierPacker.bat 中,有一段非常硬核的代码:
powershell -Command "Start-Process ... -Verb RunAs"

为什么要这么做?
因为打包过程需要调用系统级的 7za.exe 并往可能受到保护的目录下写文件。这段代码确保了用户双击运行时,如果权限不够,会自动跳出 UAC 弹窗申请管理员权限,而不需要用户手动右键运行。

2. Builder.hta 的 ActiveX 调用

Builder 之所以能读取你的文件夹路径,是因为它使用了 Windows 的壳层对象:
var shell = new ActiveXObject("Shell.Application");
var folder = shell.BrowseForFolder(0, "选择要打包的文件夹", 0);


七、 字典检索:sed.exe 的妙用

Pier 的核心没有使用复杂的数据库解析器,而是用了著名的流编辑器 sed.exe

逻辑示例:
sed.exe -n "/\[welcome\]/{n;p}" lang.ini

口语化解释:
“喂,sed,帮我去 lang.ini 账本里找一个叫 [welcome] 的标签。找到了之后,别打印标签这一行,打印它的下一行内容。”

这种设计极其精妙:

  • 极速:sed 处理文本的速度是毫秒级的。
  • 解耦:你想改文字,只需要改 lang.ini,一通代码都不用动。

八、 全局组件流转逻辑

  1. 启动阶段

    • pier.bat 读取 .share/config/language.ini 确定语言。
    • 调用 sedlang.ini 抓取对应的翻译文字。
  2. 指令阶段

    • 用户输入 pier install wechat
    • pier.bat 访问 sourceimage.ini 获取下载服务器地址。
  3. 交互阶段

    • pier.bat 生成一个包含环境参数的 pier_env.tmp
    • start /wait install.hta
    • 用户在 HTA 看到精美的软件介绍。
  4. 执行阶段

    • 如果用户点 Y,HTA 写下 pier_choice.tmp
    • pier.bat 醒来,调用 uma-get.exe 下载包。
    • 调用 unzip.exe 解压包。
    • 执行包内的 autorun.bat

结语:古法技术的新生命

Pier 不是最先进的,但它一定是最“通透”的。通过对 pier.batPierPacker 以及各色 ini 文件的拆解,我们看到了一种利用原生能力解决复杂问题的匠心。

给开发者的建议:
如果你想扩展 Pier,不要试图加入厚重的库。保持它的轻量,保持它的 Batch + HTA 架构。这正是 Pier 区别于其他成千上万个软件管理器的独特魅力。


文档编写:Gemini Thought Partner
适用版本:Pier 2.0.0 & PierPacker 1.5.0+