makeself - 在Unix上制作自解压缩档案
[makeself.sh][1]是一个小型shell脚本,用于从目录生成自解压缩的压缩tar档案。生成的文件看起来像一个shell脚本(许多此类文件以**.run**为后缀),可以直接运行。档案会将自身解压到一个临时目录,并可选择执行任意命令(例如安装脚本)。这与Windows世界中WinZip自解压程序生成的档案非常相似。Makeself档案还包括用于完整性自验证的校验和(CRC和/或MD5/SHA256校验和)。
makeself.sh脚本本身仅用于从文件目录创建档案。生成的档案实际上是一个压缩(使用gzip、bzip2或compress)的TAR档案,开头有一个小型shell脚本存根。这个小存根执行提取文件、运行嵌入命令以及完成后删除临时文件的所有步骤。用户只需"运行"档案即可安装其中包含的软件,即sh nice-software.run。我建议对此类档案使用".run"(由Loki Software发布的一些Makeself档案引入)或".sh"后缀,以避免用户混淆,让他们知道这些实际上是shell脚本(尽管附加了相当多的二进制数据!)。
我尽量保持这个脚本的代码尽可能具有可移植性,即不依赖任何bash特定功能,只调用任何功能正常的UNIX兼容系统上安装的命令。只要压缩程序可用,此脚本及其生成的档案应该可以在任何Unix风格的系统上运行,并与任何兼容的Bourne shell一起使用。
Makeself已在以下平台上重写和测试:
- Linux(所有发行版)
- Sun Solaris(8及以上版本)
- HP-UX(在HPPA RISC上测试11.0和11i)
- SCO OpenUnix和OpenServer
- IBM AIX
- macOS(Darwin)
- SGI IRIX 6.5
- FreeBSD
- OpenBSD
- NetBSD
- UnicOS / Cray
- Windows(Cygwin,WSL)
如果您在其他系统上成功运行Makeself和/或使用它创建的档案,请[告诉我][2]!
使用makeself制作的公开可用档案示例包括:
- [Id Software][3]游戏的Linux版本补丁和安装程序,如Quake 3或重返德军总部;
- [Loki Software][4]为流行游戏的Linux版本发布的所有游戏补丁;
- Linux版[nVidia驱动程序][5]
- Linux版[Google Earth][6]的安装程序
- Linux版[VirtualBox][7]安装程序
- [Makeself][1]发行版本身;-)
- 以及无数其他...
Apache用户重要提示: 默认情况下,大多数Web服务器会将Makeself档案视为普通文本文件,因此它们可能在Web浏览器中显示为文本。防止这种情况的正确方法是为此文件格式添加MIME类型,如下所示(在httpd.conf中):
AddType application/x-makeself .run
某些GNU/Linux发行版重要提示: 在v2.1.2之前使用Makeself创建的档案使用了Unix命令_head_和_tail_的旧语法,这种语法在其GNU形式中正在逐步被废弃。因此,解压缩某些这些档案时可能会遇到问题。解决此问题的一种方法是设置环境变量$_POSIX2_VERSION以启用旧语法,即:
export _POSIX2_VERSION=199209
用法
makeself的语法如下:
makeself.sh [参数] 档案目录 文件名 标签 启动脚本 [脚本参数]
-
参数 是Makeself的可选选项。可用选项包括:
-
--version
:在标准输出上打印版本号,然后立即退出 -
--gzip
:使用gzip进行压缩(在gzip常用的平台上,如Linux,这是默认设置) -
--bzip2
:使用bzip2代替gzip以获得更好的压缩效果。bzip2命令必须在命令路径中可用。建议将归档扩展名设置为类似".bz2.run",以便潜在用户知道他们需要bzip2来解压缩。 -
--bzip3
:使用bzip3代替gzip以获得更好的压缩效果。 -
--pbzip2
:在多CPU机器上使用pbzip2代替gzip以获得更好更快的压缩效果。pbzip2命令必须在命令路径中可用。建议将归档扩展名设置为类似".bz2.run",以便潜在用户知道他们需要bzip2来解压缩。 -
--xz
:使用xz代替gzip以获得更好的压缩效果。xz命令必须在命令路径中可用。建议将归档扩展名设置为类似".xz.run",以便潜在用户知道他们需要xz来解压缩。 -
--lzo
:使用lzop代替gzip以获得更好的压缩效果。lzop命令必须在命令路径中可用。建议将归档扩展名设置为类似".lzo.run",以便潜在用户知道他们需要lzop来解压缩。 -
--lz4
:使用lz4代替gzip以获得更好的压缩效果。lz4命令必须在命令路径中可用。建议将归档扩展名设置为类似".lz4.run",以便潜在用户知道他们需要lz4来解压缩。 -
--zstd
:使用zstd代替gzip以获得更好的压缩效果。zstd命令必须在命令路径中可用。建议将归档扩展名设置为类似".zstd.run",以便潜在用户知道他们需要zstd来解压缩。 -
--pigz
:使用pigz进行压缩。 -
--base64
:将归档编码为Base64格式的ASCII,而不是压缩(需要base64命令)。 -
--gpg-encrypt
:使用gpg -ac -z $COMPRESS_LEVEL
加密归档。这将提示输入加密密码。假设潜在用户已安装gpg
。 -
--ssl-encrypt
:使用openssl aes-256-cbc -a -salt
加密归档。这将提示输入加密密码。假设潜在用户已安装OpenSSL工具。 -
--compress
:使用UNIX的compress
命令压缩数据。这应该是所有没有gzip可用的平台的默认设置。 -
--nocomp
:不对归档使用任何压缩,归档将是未压缩的TAR。 -
--complevel
:指定gzip、bzip2、pbzip2、zstd、xz、lzo或lz4的压缩级别。(默认为9) -
--threads
:指定支持并行化的压缩器使用的线程数。省略以使用压缩器的默认值。最有用(且必需)的是选择xz的线程,通常使用--threads=0
表示使用所有可用核心。pbzip2和pigz默认是并行的,设置此值允许限制它们使用的线程数。 -
--notemp
:生成的归档不会将文件解压到临时目录,而是在当前目录中创建一个新目录。这更适合分发可能自行解压和编译的软件包(即通过嵌入的脚本启动编译)。 -
--current
:文件将被解压到当前目录,而不是子目录。此选项隐含上面的--notemp
。 -
--follow
:跟踪归档目录内的符号链接,即存储被指向的文件而不是链接本身。 -
--append
(2.1.x新增):将数据附加到现有归档,而不是创建新归档。在此模式下,将重用原始归档的设置(压缩类型、标签、嵌入脚本),因此不需要在命令行上再次指定。 -
--header
:Makeself使用一个单独的文件存储头部存根,称为makeself-header.sh
。默认情况下,假定它与makeself.sh存储在同一位置。如果存储在其他地方,可以使用此选项指定其实际位置。 -
--preextract
:指定预解压脚本。该脚本在与startup_script
相同的环境和初始script_args
下执行。 -
--cleanup
:指定在执行被中断或成功完成时运行的脚本。该脚本在与startup_script
相同的环境和初始script_args
下执行。 -
--copy
:解压时,归档首先将自身解压到临时目录。这主要用于允许存储在CD上Makeself归档中的自包含安装程序,当安装程序稍后需要卸载CD并允许插入新CD时。这可以防止跨多个CD的安装程序出现"文件系统忙"错误。 -
--nox11
:禁用在X11中自动生成新终端。 -
--nowait
:从新的X11终端执行时,禁用脚本执行结束时的用户提示。 -
--nomd5
和--nocrc
:禁用为归档创建MD5/CRC校验和。如果不需要完整性检查,这可以加快提取过程。 -
--sha256
:为归档添加SHA256校验和。除非同时使用了--nomd5
,否则这将与MD5/CRC校验和一起添加。 -
--lsm
文件:向makeself提供Linux软件地图(LSM)文件,该文件将嵌入到生成的归档中。LSM文件以易于解析的方式描述软件包。稍后可以使用归档的--lsm
参数检索LSM条目。 -
--tar-format opt
:指定tar归档格式(默认为ustar);你可以使用tar命令接受的任何值(如posix、v7等)。 -
--tar-extra opt
:在tar命令行中附加更多选项。例如,为了使用GNU
tar
从打包的归档目录中排除.git
目录,可以使用makeself.sh --tar-extra "--exclude=.git" ...
-
--target dir
:指定解压缩文件的目录。 -
--keep-umask
:保持umask设置为shell默认值,而不是在执行自解压档案时覆盖。 -
--packaging-date date
:使用提供的字符串作为打包日期,而不是当前日期。 -
--license
文件:附加一个许可证文件。 -
--nooverwrite
:如果指定的目标目录已存在,则不解压档案。 -
--help-header
文件:为档案的--help
输出添加一个头部。 -
archive_dir
是包含要归档文件的目录名称 -
file_name
是要创建的档案名称 -
label
是描述包的任意文本字符串。它将在解压文件时显示。 -
startup_script
是要从提取文件的目录内执行的命令。因此,如果您希望执行此目录中包含的程序,必须在命令前加上./
。例如,./program
就可以。script_args
是此命令的附加参数。 请注意,对于不在临时目录中解压的档案(即使用--notemp
时),startup_script
及其参数并非严格要求。
这里有一个例子,假设用户在**/home/joe/mysoft中存储了一个软件包镜像,他想生成一个名为mysoft.sh**的自解压包,该包将启动最初存储在/home/joe/mysoft中的"setup"脚本:
makeself.sh /home/joe/mysoft mysoft.sh "Joe的优秀软件包" ./setup
这里还展示了我如何创建包含Makeself发行版的[makeself.run][9]档案:
makeself.sh --notemp makeself makeself.run "Stephane Peter制作的Makeself" echo "Makeself已自行解压"
使用Makeself生成的档案可以传递以下参数:
--keep
:防止文件被解压到临时目录中,该目录将在嵌入脚本执行后被删除。文件将被解压到当前工作目录,并保留在此处直到您删除它们。--verbose
:在执行嵌入命令前提示用户--target dir
:允许将档案解压到任意位置。--nox11
:不生成X11终端。--confirm
:在运行嵌入命令前提示用户确认。--info
:打印关于档案的一般信息(不解压)。--lsm
:如果存在LSM条目,则打印出来。--list
:列出档案中的文件。--check
:使用嵌入的校验和检查档案的完整性。不解压档案。--nochown
:默认情况下,解压后会在目标目录上运行chown -R
命令,以便所有文件属于当前用户。如果您以root身份运行,这主要是必需的,因为tar会尝试重新创建初始用户所有权。您可以使用此标志禁用此行为。--tar
:在档案内容上运行tar命令,使用以下参数作为命令参数。--noexec
:解压后不运行嵌入的脚本。--noexec-cleanup
:不运行嵌入的清理脚本。--nodiskspace
:在尝试解压之前不检查可用磁盘空间。--cleanup-args
:指定要传递给清理脚本的参数。将值用引号括起来以指定多个参数。
档案的任何后续参数都将作为附加参数传递给嵌入命令。您必须在任何此类选项之前明确使用--
特殊命令行结构,以确保Makeself不会尝试解释它们。
启动脚本
启动脚本必须是常规的Shell脚本。
在启动脚本中,您可以使用$USER_PWD
变量获取执行自解压脚本的文件夹路径。这对于访问与脚本位于同一文件夹中的文件特别有用,如下例所示。
my-self-extracting-script.sh --fooBarFileParameter foo.bar
构建和测试
克隆git仓库并执行git submodule update --init --recursive
以获取所有子模块。
- 要进行发布:
make
- 要运行所有测试:
make test
Maven使用
Makeself现在支持以下maven插件makeself-maven-plugin。请参考该项目的使用方法,并在该项目上报告有关maven插件的任何错误。
许可证
Makeself本身受[GNU通用公共许可证][8](GPL)版本2及以上版本的保护。由Makeself生成的档案不必置于此许可下(尽管我鼓励这样做;-)),因为档案本身仅是Makeself的数据。
贡献
我很乐意考虑合并您在[GitHub][10]仓库上的拉取请求。但是,请记住以下几点:
- Makeself的主要目的之一是可移植性。不要提交会破坏支持平台的补丁。越是平台无关越好。
- 请清楚地解释补丁的目的,以及您是如何实现的。
下载
在[这里][9]获取最新的官方发行版(版本2.5.0)。
最新的开发版本可以从[GitHub][10]获取。欢迎通过fork和拉取请求过程在那里提交任何补丁。
版本历史
- v1.0: 初始公开发布
- v1.1: 归档文件现可传递参数给嵌入的脚本,感谢John C. Quillan
- v1.2: 界面更新,支持bzip2压缩和非临时归档。许多想法感谢Francois Petitjean。
- v1.3: 来自Bjarni R. Einarsson和Francois Petitjean的更多补丁:支持无压缩(
--nocomp
),脚本不再是必需的,自动在xterm中启动,可选的详细输出,以及-target归档选项用于指定文件提取位置。 - v1.4: 来自Francois Petitjean的多个补丁:改进UNIX兼容性,自动完整性检查,支持LSM文件以在运行时获取包信息。
- v1.5.x: 大量错误修复和其他补丁,包括通过使用校验和进行自动验证。1.5.5版本长期以来一直是稳定版本,尽管网页并未更新;-)。Makeself也正式成为[Loki Setup安装程序][11]的一部分,其源代码作为该包的一部分进行维护。
- v2.0: Makeself的完全内部重写。大幅改进了命令行解析,通过将存根与makeself.sh分离,极大地改善了包的整体维护。此外,Makeself还被移植并测试到多种Unix平台。
- v2.0.1: 新2.0分支的首次公开发布。之前的版本正式废弃。此版本引入了
--copy
参数,以响应[UT2K3][12] Linux安装程序的需求。 - v2.1.0: 重大变更:Makeself现在可以支持多个嵌入的tar包,每个都单独存储并有自己的校验和。可以使用
--append
标志更新现有归档。校验和管理得到改进,归档的--nochown
选项也出现了。 - v2.1.1: 修复了与Unix压缩(compress命令)相关的问题。一些Linux发行版做出了不提供它的疯狂选择,尽管gzip能够解压这些文件,此外还修复了提取和校验和代码中的一些错误。
- v2.1.2: 一些错误修复。使用head -n以避免POSIX兼容性问题。
- v2.1.3: 修复了在生成终端时的命令行问题。为归档添加了
--tar
、--noexec
。添加了--nomd5
和--nocrc
以避免在归档中创建校验和。嵌入的脚本现在通过"eval"运行。--info
输出现在包括用于创建归档的命令。Bartosz Fenski贡献了一个man页面。 - v2.1.4: 修复了
--info
输出。在提取文件到当前目录时生成随机目录名以避免问题。更好地处理包含文件的目录权限错误。避免一些竞态条件,取消设置$CDPATH变量以避免设置时的问题。更好地处理归档目录中的点文件。 - v2.1.5: 使md5sum检测与头部代码一致。检查归档目录是否存在。添加了
--encrypt
用于通过gpg进行对称加密(Eric Windisch)。为Solaris 10上的MD5校验和添加了digest命令支持。在提取到目标目录之前检查可用磁盘空间(Andreas Schweitzer)。允许提取异步运行(Peter Hatch的补丁)。内部使用文件描述符以避免错误消息(Kay Tiong Khoo的补丁)。 - v2.1.6: 将每个文件的一个点进度替换为实时进度百分比和旋转光标。添加了
--noprogress
以防止在解压缩期间显示进度。添加了--target
目录以允许直接提取到目标目录。(Guy Baconniere) - v2.2.0: 多年来的第一个重大新版本!包括许多错误修复和用户贡献。请查看[GitHub上的项目页面][10]了解所有详细信息。
- v2.3.0: 支持通过GPG或OpenSSL进行归档加密。添加了LZO和LZ4压缩支持。设置打包日期和防止umask被覆盖的选项。可选忽略提取时可用磁盘空间检查。新选项在提取前检查root权限。
- v2.3.1: 各种兼容性更新。在GitHub仓库中为Travis CI添加了单元测试。新的
--tar-extra
、--untar-extra
、--gpg-extra
、--gpg-asymmetric-encrypt-sign
选项。 - v2.4.0: 添加了可选的SHA256归档完整性校验和支持。
- v2.4.2: 新的--cleanup和--cleanup-args参数用于清理脚本。为支持的压缩器添加了线程支持。现在支持zstd压缩。
- v2.4.3: 创建显式POSIX tar归档以提高兼容性。
- v2.4.4: 修复了各种兼容性问题(不再使用POSIX tar归档),GitHub Actions用于检查Solaris和FreeBSD。
- v2.4.5: 添加了
--tar-format
选项以设置tar归档格式(默认为ustar) - v2.5.0: 扩展支持NetBSD、OpenBSD、Busybox和其他最小发行版,如Alpine Linux。添加了bzip3压缩支持并扩展了GPG参数。
链接
- 查看["Loki Setup"][11]安装程序,用于安装许多Linux游戏和其他应用程序,我是其共同作者。自Loki消亡后,我现在是该项目的官方维护者,它现在托管在GitHub上。
- Bjarni R. Einarsson还编写了受Makeself启发的setup.sh安装程序脚本。[快来看看!][14]
联系
这个脚本由[Stéphane Peter][15](megastep at megastep.org)编写。欢迎任何改进和建议。
John C. Quillan、Bjarni R. Einarsson、Francois Petitjean、Ryan C. Gordon以及GitHub上的许多贡献者都提供了贡献。如果你认为我遗漏了你的名字,请随时与我联系。
这个项目现在托管在GitHub上。欢迎在[项目页面][10]上提交补丁和错误报告。
[Stephane Peter][2] [1]: http://makeself.io/ [2]: mailto:megastep@megastep.org [3]: http://www.idsoftware.com/ [4]: http://www.lokigames.com/products/myth2/updates.php3 [5]: http://www.nvidia.com/ [6]: http://earth.google.com/ [7]: http://www.virtualbox.org/ [8]: http://www.gnu.org/copyleft/gpl.html [9]: https://github.com/megastep/makeself/releases/download/release-2.5.0/makeself-2.5.0.run [10]: https://github.com/megastep/makeself [11]: https://github.com/megastep/loki_setup/ [12]: http://www.unrealtournament2003.com/ [13]: http://www.icculus.org/ [14]: http://bre.klaki.net/programs/setup.sh/ [15]: https://stephanepeter.com/