4个稳定版本
1.0.3 | 2024年7月14日 |
---|---|
1.0.2 | 2024年3月15日 |
1.0.1 | 2023年11月21日 |
#94 in 文件系统
38每月下载量
77KB
1.5K SLoC
wrappe
从可执行文件和目录创建自包含单二进制应用程序的打包器。
功能
- 将可执行文件及其依赖项打包成单个自包含的二进制文件
- 使用Zstandard压缩打包的有效负载
- 具有最小内存开销的流式解压缩
- 并行压缩和解压缩文件
- 仅在需要时检查现有文件以进行解压缩
- 自动传输资源,包括图标和版本信息
- 支持Windows、macOS、Linux等多个平台
使用wrappe,您可以将应用程序及其文件作为单个可执行文件分发,无需安装程序,同时比许多替代方案具有更小的文件大小和更快的启动速度。
使用方法
下载
最新版本的快照构建可以在发布页面上找到。
快照构建包含Windows(x86_64-pc-windows-gnu
)、macOS(x86_64-apple-darwin
和aarch64-apple-darwin
)和Linux(x86_64-unknown-linux-musl
)的运行程序,允许在这些平台上进行打包而无需额外设置。
或者,可以使用cargo
安装wrappe,有关如何使用其他平台的附加运行程序编译wrappe的更多信息,请参阅编译部分。
示例
wrappe --compression 16 app app/diogenes.exe packed.exe
详细信息
运行wrappe
,指定一个input
目录、启动的command
和output
文件名以创建单个二进制可执行文件。输入目录及其包含的所有文件和链接将被打包。命令必须是输入目录内的可执行文件,在解包后应启动。
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_DIR
和WRAPPE_LAUNCH_DIR
环境变量将始终设置为解包目录和继承的工作目录的路径。
打包的Windows可执行文件将通过editpe自动将子系统、图标和其他资源转移到输出可执行文件。
选项
打包和解包的行为高度可定制。默认选项适用于大多数用例,但可以根据特定需求进行调整。
runner
此选项指定用于输出可执行文件的运行程序。运行程序是预构建的可执行文件,用于解包有效负载并启动打包的命令。如果无歧义,则接受部分匹配,例如,如果只有一个Windows运行程序可用,则接受windows
。
它默认为当前平台的本地运行程序。额外的运行程序必须在编译时包含,有关更多信息,请参阅编译部分。
compression
此选项控制Zstandard压缩级别。接受的值范围从0
到22
。更高的压缩级别将导致输出文件更小,但也会增加打包时间。
它默认为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
。
某些交叉编译目标需要设置特定的 AR
、CC
和 CXX
环境变量。可以通过环境变量 WRAPPE_TARGET_{AR|CC|CXX}_{目标三元组}
配置特定目标的 AR
、CC
和 CXX
。
当可用的 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