创建二进制deb包的实用工具
项目描述
termux-create-package
一个用于创建 二进制deb包 的实用工具。
默认情况下,它为Termux Linux环境创建二进制deb包,但通过传递 --prefix /usr
参数或在 YAML
或 JSON
清单中定义 installation_prefix: "/usr"
字段,可以创建适用于Debian或Ubuntu等Linux发行版的deb文件。
内容
兼容性
- Android版本需大于等于7.0,使用Termux App。
- Linux发行版。
- Windows系统使用cygwin或WSL。 (未测试)
下载
最新版本是v0.12.0
。
安装
请查阅INSTALLATION.md文件以获取安装说明。
当前功能
- 在
YAML
1.2.0
或JSON
清单文件中定义软件包构建信息。 - 按照debian策略创建二进制deb软件包。
- 自动创建
control
、md5sums
、conffiles
文件。 - 自动设置文件权限和所有权。
- 对软件包文件运行特定操作,例如设置shebangs。
用法
termux-create-package command is used to create binary deb packages.
Usage:
termux-create-package [optional arguments] manifests...
positional arguments:
manifests YAML or JSON manifest file(s) describing the package(s)
optional arguments:
-h, --help show this help message and exit
--help-extra show extra help message and exit
--version show program's version number and exit
-v "set verbose level,
pass once for log level "INFO" and twice for "DEBUG
--control-files-dir CONTROL_FILES_DIR
path to directory of maintainer scripts and other control files,
(default: current directory,
unless "control_files_dir" field is set or "--files-dir" is passed or "files_dir" manifest field is set)
--deb-dir DEB_DIR path to directory to create deb file in,
(default: current directory,
unless "deb_dir" manifest field is set)
--deb-name DEB_NAME name of deb file to create,
(default: "${Package}_${Version}_S{Architecture}.deb",
unless "deb_name" manifest field is set)
--files-dir FILES_DIR
path to directory of package files,
(default: relative to current directory,
unless "files_dir" manifest field is set)
--pkg-arch PKG_ARCH architecture the package was compiled for or will run on,
(default: "Architecture" manifest "control" dict field)
--pkg-version PKG_VERSION
version for the package,
(default: "Version" manifest "control" dict field)
--prefix PREFIX path under which to install the files on the target system
(default: /data/data/com.termux/files/usr,
unless "installation_prefix" manifest field is set)
--yaml force consider manifest to be in yaml format,
(default: false
The paths to YAML or JSON manifest file(s) must be passed as "manifests".
termux-create-package
脚本期望包清单文件包含有关如何构建包的信息,并定义在YAML
1.2.0
或JSON
格式中。由于YAML比JSON是更好的配置语言,特别是由于支持注释和多行字符串分割,因此首选YAML格式。
创建的deb文件将遵循Debian策略手册,并将包含以下文件
-
debian-binary
将包含软件包格式版本号。目前是2.0
。 -
control.tar*
将包含包含软件包信息的control
文件,包含软件包文件、维护者脚本和其他控制文件的md5sums
包含md5哈希。有关control
文件的更多信息,请参阅dpkg-dev/deb-control。 -
data.tar*
将包含软件包数据文件。
请注意,任何传递的可选参数将覆盖所有清单中相应清单字段的值,因此请明智使用,或者仅当传递单个清单时使用。
对于JSON清单中列表和字典的最后一个项,请注意尾随逗号,否则将引发异常。
示例YAML清单
control:
Package: hello-world
Version: 0.1.0
Architecture: all
Maintainer: GithubNick <GithubNick@gmail.com>
Depends: python (>= 3.0), libandroid-support
Homepage: https://hello-world.com
Description: |-
This is the hello world package
It is just an example for termux-create-package
.
It is just prints 'Hello world'
installation_prefix: /data/data/com.termux/files/usr
data_files:
bin/hello-world:
source: hello-world.py
set_shebang: "#!/data/data/com.termux/files/usr/bin/env python3"
share/man/man1/hello-world.1:
source: hello-world.1
示例JSON清单
{
"control": {
"Package": "hello-world",
"Version": "0.1.0",
"Architecture": "all",
"Maintainer": "GithubNick <GithubNick@gmail.com>",
"Depends": "python (>= 3.0), libandroid-support",
"Homepage": "https://hello-world.com",
"Description": [
"This is the hello world package",
" It is just an example for termux-create-package",
" .",
" It is just prints 'Hello, world'"
]
},
"installation_prefix": "/data/data/com.termux/files/usr",
"data_files": {
"bin/hello-world": { "source": "hello-world.py",
"set_shebang": "#!/data/data/com.termux/files/usr/bin/env python3" },
"share/man/man1/hello-world.1": { "source": "hello-world.1" }
}
}
包控制文件字段
在control
字典下的清单文件中的字段将被添加到control.tar*
中的control
文件中,并应包含软件包信息。
字段名必须由32/U+0021
到126/U+007E
范围内的US-ASCII字符组成,不包括空格和冒号字符,并且它不能以连字符-
或注释#
字符开头。字段名不区分大小写,但通常按照CamelCase
格式将单词的第一个字母大写。字段必须在CamelCase
格式中定义(对于版本>= 0.12.0
),但旧格式也支持以保持向后兼容性。一些键的名称以前不同,但仍然支持。
如果存在于清单中,将按顺序添加到控制文件的常见字段是Package
、Source
、Version
、Architecture
、Maintainer
、Installed-Size
、Section
、Priority
、Essential
、Depends
、Pre-Depends
、Recommends
、Suggests
、Breaks
、Conflicts
、Replaces
、Enhances
、Provides
、Homepage
、Description
。任何其他存在于清单中的字段将添加到Provides
字段之后,在Homepage
字段之前。如果清单中未定义,将自动添加Installed-Size
字段,通过计算数据文件大小。
根据 Debian 政策,Package
、Version
、Architecture
、Maintainer
和 Description
字段是必填的,它们的合法值必须存在于清单中。如果清单要在不同架构之间共享,则可以可选地通过命令选项传递 Architecture
值。
如果字段不是 list
类型,则将其转换为普通字符串并添加到控制文件中。null
或空字段不会被添加。有关详细信息,请参阅 Debian 政策中的 控制文件语法 部分。
如果字段是 list
类型但不是包关系字段之一,则列表中的每个项目将通过换行符连接并添加到控制文件中。这对于定义多行字段,如 Description
,很有帮助。
如果字段是 list
类型且是包关系字段之一,即 Depends
、Pre-Depends
、Recommends
、Suggests
、Breaks
、Conflicts
、Replaces
、Enhances
和 Provides
,则将自动以逗号加空格字符 ,
连接。如果这些字段定义为字符串,则必须在清单中每个包的字段之间添加逗号,否则 dpkg
将在 deb
安装期间抛出类似 解析文件 '/var/lib/dpkg/tmp.ci/control' 在第 6 行包 'hello-world' 附近的错误:'Depends' 字段,语法错误在引用包 'python3' 之后
的错误。由于它们解析/验证稍微复杂,因此目前没有验证这些字段。请参阅 Debian 政策中的 声明包之间的关系的部分 以获取更多详细信息。
以下所有字段都是 string
类型,除非另有说明。
Package
包的名称。在 < 0.12.0
版本中,此字段名为 name
。有关更多详细信息,请参阅 此处。
有效值:它必须只包含小写字母 a-z
、数字 0-9
、加号 +
和连字符 -
以及点 .
。它必须至少有两个字符长,并且必须以字母数字字符开头。相同的规则也适用于可选的 Source
字段。
Version
包的版本。有关更多详细信息,请参阅 此处。
有效值:它必须采用格式 [epoch:]upstream_version[-debian_revision]
。epoch
只能是整数。upstream_version
和 debian_revision
必须只包含大写或小写字母 a-zA-Z
、数字 0-9
、加号 +
和波浪号 ~
以及点 .
。upstream_version
必须以数字开头。如果设置了 debian_revision
,则允许使用连字符 -
。
Architecture
包编译的架构或将在其上运行的架构。在 < 0.12.0
版本中,此字段名为 arch
。有关更多详细信息,请参阅 此处。
如果包只包含与架构无关的数据,则设置为 all
。如果安装前缀以 /data/data/<app_package>/files/
开头,则它必须是 all
、arm
、i686
、aarch64
或 x86_64
之一,因为 Android 只支持这些架构,但是您可以通过向清单中添加 "ignore_android_specific_rules": true
条目来覆盖此规则。
有效值:必须包含一个由空格分隔的架构列表或架构通配符,只包含小写字母 a-z
、数字 0-9
、加号 +
、减号 -
和点 .
。长度至少为两个字符,并且必须以字母数字字符开头。
维护者
维护者的姓名和联系方式。应采用格式 name <email>
,例如:Foo Bar <foo.bar@baz.com>
。通常是指创建软件包的人,而不是要打包的软件的作者。有关更多详细信息,请参阅此处。
依赖项
以逗号分隔的依赖包列表。当使用 apt
安装此包时,将自动安装这些包。
主页
项目主页的URL。有关更多详细信息,请参阅此处。
描述
包含二进制包的描述,由两部分组成,摘要或简短描述,以及详细描述。有关更多详细信息,请参阅此处。它是一个 多行
字段,其格式如下
Description: Single line short description
extended description over several lines
.
some more description
对于 control
文件中的 多行
字段,第一行之后的每行必须以空格字符
作为第一个字符,并且必须包含至少一个非空白字符,如点 .
,否则在 deb
安装期间 dpkg
将抛出错误,如 解析文件 '/var/lib/dpkg/tmp.ci/control' 在行 8 包 'hello-world' 附近:字段名称 'It' 必须后跟冒号
。为了表示空行,将行设置为空格字符后跟点 .
要在 YAML
清单中定义 多行
字段,字段值可以设置为具有 字面块样式 |
和 strip block chomping 指示 -
(删除尾随换行符)的 |-
。每行将使用换行符 \n
连接起来。 不要忘记 -
在 |
之后,否则由于尾随换行符而被视为空行的最后一行会导致验证失败。
Description: |-
Single line short description
extended description over several lines
.
some more description
要在 JSON
清单中定义多行字段,字段值可以设置为 列表
。列表中的每个项目将使用换行符 \n
连接起来。
"Description": [
"Single line short description",
" extended description over several lines",
" .",
" some more description"
]
包创建信息字段
清单文件中除 control
和 data_files
字典之外的字段用于存储有关如何创建包以及需要添加到包中的文件的信息。这些字段不会添加到 control
文件中。
当前使用的包创建信息字段如下。除非另有说明,所有字段均为 string
类型。
allow_bad_user_names_and_ids
决定是否应允许将包文件添加到 deb 中,这些文件根据 Debian 政策被认为是无效的。有关有效性的详细信息,请参阅owner_uid
和 owner_uname
。
conffiles_prefix_to_replace
用于替换本地定义的conffiles
文件中添加到文件的可选路径前缀,该文件位于control_files_dir
或files_dir
。例如,如果此设置为/usr
,且conffiles
包含路径为/usr/etc/hello-world/hello-world.config
的文件,且安装前缀设置为/data/data/com.termux/files/usr
,则最终添加到deb文件中的conffiles
的路径将设置为/data/data/com.termux/files/usr/etc/hello-world/hello-world.config
。这不适用于使用data_files
动态生成的conffiles
文件,其中is_conffile
设置为true
。
control_files_dir
包含维护脚本preinst
、postinst
、prerm
、postrm
、config
和其他控制文件conffiles
、templates
、shlibs
的目录路径,这些文件需要包含在deb包中。默认情况下,相对于当前目录,除非脚本传递了--control-files-dir
或--files-dir
参数,或者设置了files_dir
字段。这在同一文件/构建目录用于不同的发行版或体系结构,但每个都有不同的维护脚本或conffiles
时很有用。
deb_architecture_tag
用于创建的deb文件文件名的体系结构标记。如果未设置deb_name
且未向脚本传递--deb-name
参数,则deb文件将命名为${Package}_${Version}_S{deb_architecture_tag}.deb
而不是${Package}_${Version}_S{Architecture}.deb
。如果您想在Package
和Version
字段中分别使用相同的包和版本标记,但使用与Architecture
字段中定义的不同体系结构标记,这很有帮助。
deb_dir
创建deb文件的目录路径。默认为当前目录,除非向脚本传递了--deb-dir
参数。
deb_name
要创建的deb文件的文件名。如果没有设置,则默认使用${Package}_${Version}_S{Architecture}.deb
命名deb文件,除非向脚本传递了--deb-name
参数。
files_dir
包含要包含在deb包中的包文件的目录路径。默认为相对于当前目录,除非向脚本传递了--files-dir
参数。
fix_perms
决定是否需要根据dh_fixperms
(impl)规则自动修复添加到deb文件作为包data_files
的源文件的权限的布尔字段。
fix_perms
值是全局值,可以设置为true
(默认)或false
以分别启用或禁用对所有data_files
的权限修复。如果是true
,则可以通过将特定文件的文件级fix_perm
字段值设置为false
来选择性地禁用特定文件的权限修复。如果是false
,则可以通过将特定文件的文件级fix_perm
字段值设置为true
来选择性地启用特定文件的权限修复。如果数据文件已设置perm
字段,则不修复权限。
ignore_android_specific_rules
可以将该布尔字段设置为true
以忽略以下Android特定规则
- 仅允许在
/data/data/<app_package>/files/
路径下设置前缀的情况下,允许Android特定体系结构。 - 当设置要将文件添加到
/data/data/<app_package>/files/
下的data.tar*
的权限时,如果perm
字段未设置且全局fix_perms
和/或文件级别fix_perm
设置为true
,则删除组和其他权限。 - 将要将文件添加到
/data/data/<app_package>/files/
下的data.tar*
的父目录路径权限设置为700
而不是755
。
installation_prefix
在目标系统上安装文件的安装前缀。如果该字段未定义,则默认使用 termux 前缀 /data/data/com.termux/files/usr
,除非将 --prefix
参数传递给脚本。它必须是一个以正斜杠 /
开头、以 /usr
结尾的绝对路径,并且只能包含字符范围 a-zA-Z0-9_./
。它不能包含父路径引用 ../
。
maintainer_scripts_shebang
如果维护脚本的第一行以 #!
开头,则应设置此 shebang。例如,对于 Linux 发行版,为 #!/bin/bash
;对于 termux,为 #!/data/data/com.termux/files/usr/bin/bash
。
tar_compression
control.tar*
和 data.tar*
的压缩类型。如果该字段未定义,则默认使用 xz
tar 压缩,因为这是当前版本 dpkg
的默认值。如果设置 none
,则不会进行压缩。有关详细信息,请参阅 dpkg-dev/deb。
有效值: none
、gz
和 xz
。
tar_format
control.tar*
和 data.tar*
的 tar 格式。如果该字段未定义,则默认使用 GNU tar
格式,因为这是 dpkg
官方支持的。如果使用其他格式,特别是 pax
,可能会收到损坏包的错误。有关详细信息,请参阅 dpkg-dev/deb。
有效值: gnutar
、ustar
和 pax
。
包数据文件字段
data_files
字典
是一个 必需 字段,其中包含一个嵌套的 字典
类型,其中父键是 deb 包或目标系统内数据文件的目标路径,值是一个包含以下键/值对的 字典
(版本 >= 0.12.0
)。
如果目标路径是一个以正斜杠 /
开头的绝对路径,则将使用它。否则,它将被视为相对于安装前缀的相对路径。如果目标路径为空字符串 ""
,则它将自动展开到安装前缀。
字段值为 null
或空的字段不使用,除了 source
路径。
根据 Debian 政策,路径中不允许包含非 utf-8
字符。
必需的属性键/值对
source
从其中读取要添加到包中的文件的源路径的数据文件的源路径。如果源路径是一个以正斜杠 /
开头的绝对路径,则将使用它;否则,它将被视为相对于当前工作目录,除非将 --files-dir
参数传递给脚本或设置 files_dir
字段。如果源路径为空字符串 ""
,则在目标路径将添加一个空目录。
可选的属性键/值对
fix_perm
一个定义在将源文件添加到 deb 时是否应该对文件级别设置修复权限的 bool
值。有关更多信息,请参阅 fix_perms
。
is_conffile
一个定义此数据文件是否为 conffile
并且应该添加到动态生成的 conffiles
文件的 bool
值。
owner_uid
在将数据文件添加到deb时,应设置的所有者用户ID。它必须在 0-99
、60000-64999
和 65534
范围内。默认情况下设置用户ID 0
,除非设置了 source_ownership
。优先级上,source_ownership
覆盖 owner_uid
。
请查看 debian policy
、useradd manual
、systemd uid/gid docs
和 shadow
find_new_uid.c
获取更多信息。
请注意,当使用termux应用在android上安装deb
文件时,任何自定义的所有者值都不会设置,所有文件都将设置为termux
用户所有权。
owner_uname
在将数据文件添加到deb时,应设置的所有者用户名。它必须以下划线或小写字母开头,后跟小写字母、数字、下划线或连字符。它可以以美元符号结尾。用正则表达式表示为:[a-z_][a-z0-9_-]*[$]?
。它也可以长达32
个字符。默认用户名为root
,除非设置了 source_ownership
。优先级上,source_ownership
覆盖 owner_uname
。
请查看 debian policy
、useradd manual
、shadow
useradd.c
、systemd user name docs
、shadow
chkname.c
和 posix docs
获取更多信息。
group_uid
在将数据文件添加到deb时,应设置的用户组ID。与 owner_uid
的规则相同。
group_uname
在将数据文件添加到deb时,应设置的用户组名。与 owner_uname
的规则相同。
perm
在将数据文件添加到deb时,应设置的3
或4
位权限八进制数。例如:755
代表rwxr-xr-x
,或4755
代表rwsr-xr-x
,其中设置了setuid
位。如果perm
字段中的自定义值未设置,则权限将自动修正。请查看 fix_perms
获取更多信息。
source_ownership
表示在将数据文件添加到deb时是否应使用源所有权的布尔值。如果源所有权不符合debian策略,则忽略并使用root:root
所有权。请查看 owner_uid
和 owner_uname
了解有效性的详细信息。
可选操作键值对
ignore
表示是否应忽略在清单中定义的此数据文件,并不要将其添加到deb的布尔值。不进行源文件存在检查。
ignore_if_no_exist
表示是否在源路径不存在时忽略在清单中定义的此数据文件,而不是命令退出失败。的布尔值。
set_parent_perm
表示是否应将权限设置为数据文件目录的父目录路径,与源权限或由 perm
定义的权限相同。例如,如果添加了opt/hello-world/cache
的目标条目,那么opt
和opt/hello-world
也将设置相同的权限。这对于定义具有相同特定权限的目录层次结构很有用。
set_shebang
如果数据文件的第一行以 #!
开头,则应设置在数据文件上的魔数。例如:对于 Linux 发行版 #!/bin/bash
,对于 Termux 是 #!/data/data/com.termux/files/usr/bin/bash
。
source_readlink
是否遍历 source
路径的 bool
值,如果它是符号链接。默认情况下,如果 source
文件是符号链接,则符号链接本身将被添加到 deb 文件中,而不是其目标文件。
source_recurse
是否将 source
路径下的所有文件递归地添加到 deb,如果它是目录的 bool
值。默认情况下,source
目录下的文件不会自动/递归地添加到 deb 中。需要添加到 deb 的每个文件都必须单独添加。这对于文件/构建目录包含大量文件但只想将特定文件添加到 deb 的情况很有用。您可以仅添加目录条目而不添加任何文件条目,这将在目标系统上理想地创建一个空目录(如果它尚未存在)。
symlink_destinations
定义应自动创建并添加到 deb 的目标数据文件路径的符号链接的 list
值。例如,将目标文件 bin/hello-world.1
的条目添加到 symlink_destinations
,并将 bin/hello-world
添加到 symlink_destinations
将创建一个指向 bin/hello-world.1
的 bin/hello-world
文件。这有助于动态地为文件定义一个或多个符号链接,而无需在源系统上创建符号链接文件。
如果需要将特定权限设置为目标系统中需要安装的文件的父目录,则可以在文件的条目之前添加一个空的 source
条目,将 perm
字段设置为,可选地设置 set_parent_perm
为 true
。但是,如果目录已在目标系统上存在,则权限不太可能更改,应使用维护脚本。
"data_files": {
"bin": { "source": "", "perm": "755" },
"bin/hello-world": { "source": "hello-world.py", "perm": "755" },
"share/man/man1/hello-world.1": { "source": "hello-world.1", "perm": "644" }
}
旧的 files
格式
在版本 < 0.12.0
中,此 data_files
字段名为 files
,其中 source
作为字典键而不是目标。这存在设计缺陷,即单个源文件只能添加到 deb 中的一个目标路径。此外,由于目标不是键而是值,可以为同一目标添加多个源文件。新设计没有这样的问题,并且路径被归一化以检查重复项。旧格式也完全支持以保持向后兼容性。在版本 >= 0.8
中,使用 files
字段,将源路径目录中的文件递归地添加到 deb 中,但在版本 >= 0.12.0
中,使用新的 data_files
字段,如 source_recurse
中所述,则不会发生这种情况。请注意,任何所有者不符合 debian 政策的文件(如 owner_uid
和 owner_uname
中详细说明),其所有者将被替换为 root:root
。这可能是唯一破坏性的更改,并且使用旧格式的用户应切换到新格式,并将 allow_bad_user_names_and_ids
设置为 true
,如果他们想违反 debian 政策。
"files": {
"hello-world.py": "bin/hello-world",
"hello-world.1": "share/man/man1/hello-world.1"
}
其他控制文件
如果维护脚本 preinst
、postinst
、prerm
、postrm
、config
以及其他控制文件 conffiles
、templates
、shlibs
存在于 control_files_dir
或 files_dir
中,则它们将自动添加到 control.tar*
中。
所有添加到 control.tar*
的文件的所有权将自动设置为 root:root
,根据 debian 政策。维护脚本权限将自动设置为 755
,其他控制文件设置为 644
。
maintainer_scripts_shebang
字段对于需要添加到不同 Linux 发行版和 Termux 的相同架构独立脚本非常有用。有关详细信息,请参阅 Debian 政策中脚本部分。
conffiles
可以通过两种方式添加到 deb 中。可以将预定义文件添加到 control_files_dir
或 files_dir
中,或者通过将 is_conffile
字段设置为 true
来动态生成应该添加到 conffiles
中的 data_files
。如果任何一个文件设置了 is_conffile
为 true
,则不会添加 control_files_dir
或 files_dir
中的任何预定义 conffiles
,并且会添加动态生成的 conffiles
。所有添加到 conffiles
中的文件都会验证其存在于 deb 中,如果任何文件不存在,则会引发错误。如果定义了预定义文件,那么在为 Linux 发行版和 Termux 构建 deb 时,conffiles_prefix_to_replace
也可能很有用。根据 Debian 政策,conffiles
文件内容必须是 utf-8
编码的,并且所有文件都必须是常规文件而不是符号链接(因为这不官方支持并且可能导致不可预测的行为),目录也不受支持。每一行都必须包含一个绝对文件路径。不允许空行。有关详细信息,请参阅 Debian 政策中的配置文件部分。
示例
创建项目清单后,运行 termux-create-package </path/to/manifest>
命令来创建 deb 文件。在 examples
目录中提供了 YAML 和 JSON 格式的示例清单。
-
使用默认设置创建 deb 包文件:
termux-create-package manifest.yml
-
使用特定安装前缀、文件目录、deb 目录和 deb 名称创建 deb 包文件:
termux-create-package --prefix '/usr' --files-dir '/path/to/files_directory' --deb-dir '/path/to/deb_directory' --deb-name 'some-name.deb' manifest.json
-
从
termux-create-package
仓库源创建示例清单 deb:cd examples/hello-world; ../../src/termux-create-package -vv manifest-ubuntu.yml
可以通过运行 dpkg -i package.deb
来安装 deb 文件。dpkg
安装命令不会安装依赖项,您可以通过运行 apt-get -f install
来安装它们。
deb 文件还可以添加到使用 termux-apt-repo
或任何其他可用工具创建的自定义 apt 仓库中。
项目详情
termux-create-package-0.12.0.tar.gz 的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | 9309ad61f6d29d7f559d773b2c72677b4eb5ea6a6e0ac05e66196421fe421dc1 |
|
MD5 | d98313fd8d7d03fc6a79c19be845dd19 |
|
BLAKE2b-256 | 715c2e76dbf048e607fb057ca7c97f93bf64499b41189d2e78e11d7fe0c54ac5 |