#executable #packer #binary #filesize

app wrappe

从可执行文件和目录创建自包含单二进制应用程序的打包器

4个稳定版本

1.0.3 2024年7月14日
1.0.2 2024年3月15日
1.0.1 2023年11月21日

#94 in 文件系统

38每月下载量

BSD-2-Clause

77KB
1.5K SLoC

wrappe

Release Crates.io Tests & Checks

从可执行文件和目录创建自包含单二进制应用程序的打包器。

功能

  • 将可执行文件及其依赖项打包成单个自包含的二进制文件
  • 使用Zstandard压缩打包的有效负载
  • 具有最小内存开销的流式解压缩
  • 并行压缩和解压缩文件
  • 仅在需要时检查现有文件以进行解压缩
  • 自动传输资源,包括图标和版本信息
  • 支持Windows、macOS、Linux等多个平台

使用wrappe,您可以将应用程序及其文件作为单个可执行文件分发,无需安装程序,同时比许多替代方案具有更小的文件大小和更快的启动速度。

使用方法

下载

最新版本的快照构建可以在发布页面上找到。

快照构建包含Windows(x86_64-pc-windows-gnu)、macOS(x86_64-apple-darwinaarch64-apple-darwin)和Linux(x86_64-unknown-linux-musl)的运行程序,允许在这些平台上进行打包而无需额外设置。

或者,可以使用cargo安装wrappe,有关如何使用其他平台的附加运行程序编译wrappe的更多信息,请参阅编译部分。

示例

wrappe --compression 16 app app/diogenes.exe packed.exe

详细信息

运行wrappe,指定一个input目录、启动的commandoutput文件名以创建单个二进制可执行文件。输入目录及其包含的所有文件和链接将被打包。命令必须是输入目录内的可执行文件,在解包后应启动。

wrappe [OPTIONS] <input> <command> [output] [-- <ARGUMENTS>...]

Arguments:
  <input>         Path to the input directory
  <command>       Path to the executable to start after unpacking
  [output]        Path to or filename of the output executable
  [ARGUMENTS]...  Command line arguments to pass to the executable

Options:
  -r, --runner <RUNNER>
        Platform to pack for (see --list-runners for available options) [default: native]
  -c, --compression <COMPRESSION>
        Zstd compression level (0-22) [default: 8]
  -t, --unpack-target <UNPACK_TARGET>
        Unpack directory target (temp, local, cwd) [default: temp]
  -d, --unpack-directory <UNPACK_DIRECTORY>
        Unpack directory name [default: inferred from input directory]
  -v, --versioning <VERSIONING>
        Versioning strategy (sidebyside, replace, none) [default: sidebyside]
  -e, --verification <VERIFICATION>
        Verification of existing unpacked data (existence, checksum, none) [default: existence]
  -s, --version-string <VERSION_STRING>
        Version string override [default: randomly generated]
  -i, --show-information <SHOW_INFORMATION>
        Information output details (title, verbose, none) [default: title]
  -n, --console <CONSOLE>
        Show or attach to a console window (auto, always, never, attach) [default: auto]
  -w, --current-dir <CURRENT_DIR>
        Working directory of the command (inherit, unpack, runner, command) [default: inherit]
  -z, --build-dictionary
        Build compression dictionary
  -l, --list-runners
        Print available runners
  -h, --help
        Print help
  -V, --version
        Print version

可以在--之后指定打包可执行文件的额外参数,并在启动时自动传递给命令。

如果打包的可执行文件需要通过相对路径访问打包文件,并期望一定的当前工作目录,请使用--current-dir选项将其设置为父目录或解包目录。对于命令,WRAPPE_UNPACK_DIRWRAPPE_LAUNCH_DIR环境变量将始终设置为解包目录和继承的工作目录的路径。

打包的Windows可执行文件将通过editpe自动将子系统、图标和其他资源转移到输出可执行文件。

选项

打包和解包的行为高度可定制。默认选项适用于大多数用例,但可以根据特定需求进行调整。

runner

此选项指定用于输出可执行文件的运行程序。运行程序是预构建的可执行文件,用于解包有效负载并启动打包的命令。如果无歧义,则接受部分匹配,例如,如果只有一个Windows运行程序可用,则接受windows

它默认为当前平台的本地运行程序。额外的运行程序必须在编译时包含,有关更多信息,请参阅编译部分。

compression

此选项控制Zstandard压缩级别。接受的值范围从022。更高的压缩级别将导致输出文件更小,但也会增加打包时间。

它默认为8

unpack-target

此选项指定打包文件解包到的目录。接受的值包括

  • temp:文件将被解包到系统临时目录。
  • local:文件将被解包到本地数据目录,通常在Windows上是User/AppData/Local,在Linux上是/home/user/.local/share
  • cwd:文件将被解包到运行程序可执行文件的当前工作目录。

它默认为temp

unpack-directory

此选项指定unpack-target内部的解包目录名称。它默认为输入文件或目录的名称。

versioning

此选项指定版本策略。接受的值包括

  • sidebyside:为每个版本创建单独的目录。已解包的版本将不再解包。
  • replace:来自不同版本的已解包文件将被覆盖。同一版本的已解包文件将不再解包。
  • none:打包文件始终解包,已解包的文件将被覆盖。

它默认为sidebyside。版本由打包过程中生成的唯一标识符或通过version-string选项指定的版本字符串确定。

verification

此选项指定在跳过提取之前对解包的有效负载进行验证。接受的值包括

  • existence:将检查有效负载中的所有文件是否存在。
  • checksum:将计算所有文件的校验和并与打包过程中计算的校验和进行比较。
  • none:不进行验证。如果解包目录存在并且是用相同的版本字符串创建的,则将跳过解包。

它默认为existence。当versioning设置为none时,此选项不起作用。

version-string

此选项指定版本字符串。它默认为一个随机生成的8位字符串。

show-information

此选项控制运行程序的信息输出。接受的值包括

  • title:运行程序将输出wrappe版本和解包目录。
  • verbose:运行程序将输出各种其他详细信息,如解包状态、配置和有效负载大小。
  • none:运行程序将不显示任何其他输出。

默认情况下为 title。当适用时,错误信息始终显示。使用图形用户界面子系统的 Windows 运行者只有在从控制台启动且此选项设置为 verbose,或者通过 console 选项附加或打开控制台时,才会显示信息输出。

控制台

此选项控制运行器是否附加到控制台或是否在从 Windows 资源管理器启动 Windows 应用程序时打开控制台窗口。接受的值是

  • auto:根据可用的输入可执行文件的子系统选择控制台行为。如果不可用,Windows 运行者将回退到 never,而对于所有其他运行器则为 always
  • always:始终附加到或打开控制台。运行器将阻塞控制台,直到打包的可执行文件退出。
  • never:永不打开或附加到控制台。运行器将在启动打包的可执行文件后立即退出。
  • attach:永不打开新的控制台窗口,但如果可用,将附加到现有控制台。运行器将立即解除控制台阻塞,但输出仍然会显示。

默认情况下为 auto。此选项目前仅影响 Windows 运行者,其他运行器如果可用,将始终附加到控制台。此选项还将阻止打包的 Windows 命令行应用程序在从 Windows 资源管理器启动时自行打开控制台。

当前目录

此选项更改打包可执行文件的工作目录。接受的值是

  • inherit:工作目录将从运行器继承。这通常是包含运行器的目录或启动运行器的目录。
  • unpack:工作目录将设置为解包目录。这是解包有效载荷的顶层目录。
  • runner:工作目录将设置为包含运行器的目录,同时解析所有符号链接。
  • command:工作目录将设置为包含解包可执行文件的目录。这将是解包目录或解包有效载荷内的子目录。

默认情况下为 inherit

构建字典

此选项从输入文件构建 zstandard 压缩字典并将其存储在输出可执行文件中。这可以提高在打包许多小而相似的文件时的压缩比。

至少需要 8 个输入文件来构建字典,并且每个输入文件最多只能采样 128 KB 的数据。

构建字典可以增加打包时间,并且在某些情况下可能会对压缩比产生负面影响。建议在具有和没有此选项的情况下测试结果,以确定它是否对特定用例有益。

性能

Wrappe 优化了压缩比和解压速度,在两者方面通常与或其他打包程序相匹配或优于其他打包程序。打包文件从内存映射的可执行文件直接并行解压缩到磁盘,而在文件已解包的情况下会跳过提取。这使得打包可执行文件具有最少的开销并快速启动。

例如,一个 400 MB 的 PyInstaller 单目录输出,使用 Wrappe 在最大压缩级别下打包了 1500 个文件,结果是一个 100 MB 的可执行文件。在第一次运行时,它在现代系统上解包并启动大约需要 500 毫秒,而后续运行则立即启动。这比相同项目使用 PyInstaller 以单文件模式并使用 UPX 压缩打包的速度快约 50%,大小仅大 5%。后者每次运行都会解包并加载到内存中。

通常,在合理的现代系统上,Wrappe 的解压速度受存储介质的读写速度限制。

编译

编译 wrappe 也会默认为您当前的平台编译一个运行器。

cargo install wrappe

要编译和包含其他平台的额外运行器,请在环境变量 WRAPPE_TARGETS 中指定所需的 目标三元组

WRAPPE_TARGETS=x86_64-unknown-linux-gnu;x86_64-pc-windows-msvc cargo install wrappe

可以通过环境变量 WRAPPE_TARGET_RUSTFLAGS_{目标三元组} 配置特定目标的 rustflags

交叉编译

交叉编译需要额外的目标可用给 cargo。可以使用 rustup 安装目标,例如 rustup target add x86_64-unknown-linux-musl

某些交叉编译目标需要设置特定的 ARCCCXX 环境变量。可以通过环境变量 WRAPPE_TARGET_{AR|CC|CXX}_{目标三元组} 配置特定目标的 ARCCCXX

当可用的 cross 和将环境变量 WRAPPE_USE_CROSS 设置为 true 时,可以通过 cross 代替执行额外的运行器的交叉编译。

当包含多个 macOS 目标的运行器时,可以将环境变量 WRAPPE_MACOS_UNIVERSAL 设置为目标列表,以使用 lipo 构建包含指定架构的通用运行器,例如 x86_64-apple-darwin;aarch64-apple-darwin。此运行器将作为 universal-apple-darwin 包含。

依赖项

~13–43MB
~685K SLoC