跳转到主要内容

创建二进制deb包的实用工具

项目描述

termux-create-package

一个用于创建 二进制deb包 的实用工具。

默认情况下,它为Termux Linux环境创建二进制deb包,但通过传递 --prefix /usr 参数或在 YAMLJSON 清单中定义 installation_prefix: "/usr" 字段,可以创建适用于Debian或Ubuntu等Linux发行版的deb文件。

内容

兼容性

  • Android版本需大于等于7.0,使用Termux App
  • Linux发行版。
  • Windows系统使用cygwinWSL(未测试)

下载

最新版本是v0.12.0

安装

请查阅INSTALLATION.md文件以获取安装说明。

当前功能

  • YAML 1.2.0JSON清单文件中定义软件包构建信息。
  • 按照debian策略创建二进制deb软件包。
  • 自动创建controlmd5sumsconffiles文件。
  • 自动设置文件权限和所有权。
  • 对软件包文件运行特定操作,例如设置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.0JSON格式中。由于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),但旧格式也支持以保持向后兼容性。一些键的名称以前不同,但仍然支持。

如果存在于清单中,将按顺序添加到控制文件的常见字段是PackageSourceVersionArchitectureMaintainerInstalled-SizeSectionPriorityEssentialDependsPre-DependsRecommendsSuggestsBreaksConflictsReplacesEnhancesProvidesHomepageDescription。任何其他存在于清单中的字段将添加到Provides字段之后,在Homepage字段之前。如果清单中未定义,将自动添加Installed-Size字段,通过计算数据文件大小。

根据 Debian 政策,PackageVersionArchitectureMaintainerDescription 字段是必填的,它们的合法值必须存在于清单中。如果清单要在不同架构之间共享,则可以可选地通过命令选项传递 Architecture 值。

如果字段不是 list 类型,则将其转换为普通字符串并添加到控制文件中。null 或空字段不会被添加。有关详细信息,请参阅 Debian 政策中的 控制文件语法 部分。

如果字段是 list 类型但不是包关系字段之一,则列表中的每个项目将通过换行符连接并添加到控制文件中。这对于定义多行字段,如 Description,很有帮助。

如果字段是 list 类型且是包关系字段之一,即 DependsPre-DependsRecommendsSuggestsBreaksConflictsReplacesEnhancesProvides,则将自动以逗号加空格字符 , 连接。如果这些字段定义为字符串,则必须在清单中每个包的字段之间添加逗号,否则 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_versiondebian_revision 必须只包含大写或小写字母 a-zA-Z、数字 0-9、加号 + 和波浪号 ~ 以及点 .upstream_version 必须以数字开头。如果设置了 debian_revision,则允许使用连字符 -

Architecture

包编译的架构或将在其上运行的架构。在 < 0.12.0 版本中,此字段名为 arch。有关更多详细信息,请参阅 此处

如果包只包含与架构无关的数据,则设置为 all。如果安装前缀以 /data/data/<app_package>/files/ 开头,则它必须是 allarmi686aarch64x86_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"
    ]

包创建信息字段

清单文件中除 controldata_files 字典之外的字段用于存储有关如何创建包以及需要添加到包中的文件的信息。这些字段不会添加到 control 文件中。

当前使用的包创建信息字段如下。除非另有说明,所有字段均为 string 类型。

allow_bad_user_names_and_ids

决定是否应允许将包文件添加到 deb 中,这些文件根据 Debian 政策被认为是无效的。有关有效性的详细信息,请参阅owner_uidowner_uname

conffiles_prefix_to_replace

用于替换本地定义的conffiles文件中添加到文件的可选路径前缀,该文件位于control_files_dirfiles_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

包含维护脚本preinstpostinstprermpostrmconfig和其他控制文件conffilestemplatesshlibs的目录路径,这些文件需要包含在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。如果您想在PackageVersion字段中分别使用相同的包和版本标记,但使用与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

有效值: nonegzxz

tar_format

control.tar*data.tar* 的 tar 格式。如果该字段未定义,则默认使用 GNU tar 格式,因为这是 dpkg 官方支持的。如果使用其他格式,特别是 pax,可能会收到损坏包的错误。有关详细信息,请参阅 dpkg-dev/deb

有效值: gnutarustarpax

包数据文件字段

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-9960000-6499965534 范围内。默认情况下设置用户ID 0,除非设置了 source_ownership。优先级上,source_ownership 覆盖 owner_uid

请查看 debian policyuseradd manualsystemd uid/gid docsshadow 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 policyuseradd manualshadow useradd.csystemd user name docsshadow chkname.cposix docs 获取更多信息。

group_uid

在将数据文件添加到deb时,应设置的用户组ID。与 owner_uid 的规则相同。

group_uname

在将数据文件添加到deb时,应设置的用户组名。与 owner_uname 的规则相同。

perm

在将数据文件添加到deb时,应设置的34位权限八进制数。例如:755代表rwxr-xr-x,或4755代表rwsr-xr-x,其中设置了setuid位。如果perm字段中的自定义值未设置,则权限将自动修正。请查看 fix_perms 获取更多信息。

source_ownership

表示在将数据文件添加到deb时是否应使用源所有权的布尔值。如果源所有权不符合debian策略,则忽略并使用root:root所有权。请查看 owner_uidowner_uname 了解有效性的详细信息。

可选操作键值对

ignore

表示是否应忽略在清单中定义的此数据文件,并不要将其添加到deb的布尔值。不进行源文件存在检查。

ignore_if_no_exist

表示是否在源路径不存在时忽略在清单中定义的此数据文件,而不是命令退出失败。的布尔值。

set_parent_perm

表示是否应将权限设置为数据文件目录的父目录路径,与源权限或由 perm 定义的权限相同。例如,如果添加了opt/hello-world/cache的目标条目,那么optopt/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.1bin/hello-world 文件。这有助于动态地为文件定义一个或多个符号链接,而无需在源系统上创建符号链接文件。

如果需要将特定权限设置为目标系统中需要安装的文件的父目录,则可以在文件的条目之前添加一个空的 source 条目,将 perm 字段设置为,可选地设置 set_parent_permtrue。但是,如果目录已在目标系统上存在,则权限不太可能更改,应使用维护脚本。

"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_uidowner_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"
}

其他控制文件

如果维护脚本 preinstpostinstprermpostrmconfig 以及其他控制文件 conffilestemplatesshlibs 存在于 control_files_dirfiles_dir 中,则它们将自动添加到 control.tar* 中。

所有添加到 control.tar* 的文件的所有权将自动设置为 root:root,根据 debian 政策。维护脚本权限将自动设置为 755,其他控制文件设置为 644

maintainer_scripts_shebang 字段对于需要添加到不同 Linux 发行版和 Termux 的相同架构独立脚本非常有用。有关详细信息,请参阅 Debian 政策中脚本部分。

conffiles 可以通过两种方式添加到 deb 中。可以将预定义文件添加到 control_files_dirfiles_dir 中,或者通过将 is_conffile 字段设置为 true 来动态生成应该添加到 conffiles 中的 data_files。如果任何一个文件设置了 is_conffiletrue,则不会添加 control_files_dirfiles_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 (71.7 kB 查看散列值)

上传时间:

由以下支持