当前位置: 首页 > 科技观察

开始使用ArchLinux包制作

时间:2023-03-16 01:05:32 科技观察

PKGBUILD文件是您为ArchLinux及其衍生产品(如Manjaro)构建和创建包的方式。如果您曾经使用过AUR(即用户维护的ArchLinux的PKGBUILD存储库),您甚至可能也遇到过它们。但是它究竟是如何从PKGBUILD变成可安装包的呢?中间会发生什么,您如何将自己的软件打包成一个包?您将在本文中了解到这一点。PKGBUILD基础对于那些熟悉Bash或其他shell的人,您可能知道PKGBUILD只是一个带有一些变量的shell脚本。PKGBUILD文件由变量和函数组成,所有这些都用于定义包本身,以及如何构建它。要从PKGBUILD创建包,请使用makepkg命令行工具。在你有了PKGBUILD文件之后,你可以简单地在包含PKGBUILD的目录中运行`makepkg'来获得一个可安装的包。在本教程中,您将看到我刚刚制作的打印“HelloWorld!”的包。运行时。准备工作要继续学习本教程,您需要创建一些文件。首先,您需要创建一个名为PKGBUILD的文件,它将作为构建您的包的“配方”。您需要制作的另一个文件是名为hello-world.sh的文件。我稍后会解释它的作用。你也可以用一个命令创建这两个文件:touchPKGBUILDhello-world.sh你可以用ls命令查看这两个文件是否创建。那你就可以开始了!设置您的PKGBUILD文件我不会让您复制和粘贴整个文件,但我会与您一起键入每一行,以便您更好地理解每一行的用途。如果您不喜欢这种学习方式,我强烈推荐有关为ArchLinux创建包的ArchWiki文章。本文也不介绍PKGBUILD中可以设置的每一个选项,只介绍一些常用的选项,以便大家尽快上手。话虽如此,打开你的文本编辑器,让我们直奔主题。pkgname首先是pkgname变量。这是在安装时定义包名称的内容,也是ArchLinux的包管理器pacman跟踪包的方式。这个变量(和其他一些变量)的格式是变量=值,左边是变量名,右边是变量的值,用等号分隔。要设置包名称,请在PKGBUILD中输入以下内容:pkgname="hello-world"要设置不同的包名称,请将hello-world替换为您的包名称。这不会设置用于运行程序的命令,这是在下面的package()部分中处理的。pkgver正如变量名本身所说,它设置你的包的版本(即1.0.0)。这在用户更新系统时很有用,因为设置更高的版本会提示用户升级。要设置版本号,请在PKGBUILD中输入以下内容(在上一行之后):pkgver="1.0.0"pkgrel这与pkgver变量有关,通常不需要知道。但是,与pkgver变量一样,如果将其更改为更大的数字,则会通知用户升级。适用于任何需要保持pkgver不变的情况,比如PKGBUILD本身发生变化时。如果您为您使用的程序创建一个PKGBUILD(并希望将包保持在同一版本)并且您需要修复PKGBUILD本身的错误,这将很有用。要设置此变量,请在PKGBUILD中输入以下内容:pkgver="1"此变量应始终从1开始并一次向上移动一个。当pkgver本身向上移动时,可以(并且应该)将此变量重置为1,因为pkgver本身会通知用户有关升级的信息。pkgdesc这设置包描述,用于帮助更好地识别包。要设置它,只需将描述放在引号中:pkgdesc="Helloworldinyourterminal!"arch这个变量设置包兼容的硬件架构。如果您不了解模式是什么也没关系,因为在大多数情况下,这个变量几乎没有用。无论如何,makepkg仍然需要设置它,以便它知道包与我们的系统兼容。该变量支持设置多个值,因此makepkg需要不同的语法,如下所示。要设置它,请在PKGBUILD中输入以下内容:arch=("x86_64")如果要设置多个值,则需要用空格和引号分隔每个值,如下所示。拱=(“x86_x64”“手臂”)。depends这列出了提供我们包所需功能的所有包。和arch一样,它可以包含多个值,所以必须使用括号语法。因为我们的包没有任何依赖,所以我们不需要在PKGBUILD中输入这个字段。但是,如果我们的包有依赖项,我们使用与arch相同的语法。optdepends此处列出了不提供必需功能但提供附加功能的包。这与depends的语法相同。冲突这告诉pacman哪些包会导致我们的包出现问题,或者以我们不希望的方式运行。在安装我们的包之前,此处列出的任何包都将被卸载。这与depends的语法相同。license这定义了您的程序使用的软件许可证。如果您在选择许可证方面需要帮助,Archwiki有一些信息。如果您不知道如何设置它,将其设置为自定义也可以。这与arch的语法相同并且依赖于:license=("custom")source这就是makepkg知道使用哪些文件来构建我们的包的方式。它可以包含各种不同类型的来源,包括本地文件和URL。添加本地文件时,输入相对于PKGBUILD文件的文件路径,比如下面的目录布局:PKGBUILDfile.txtsrc/file.sh如果要在我们的PKGBUILD中包含file.sh,需要输入src/file.sh作为它的名字。输入网址时,只需要输入完整的网址,即https://mirrors.creativecommons.org/presskit/logos/cc.logo.large.png。您只需要这个包的hello-world.sh文件,因为它与PKGBUILD位于同一目录中,您只需输入它的名称作为源的值。该变量也使用与arch相同的语法并依赖于:source=("hello-world.sh")sha512sums这用于验证source中的文件没有被修改或下载错误。有关如何获取此值的信息可以在ArchWiki上关于PKGBUILD的文章中找到。如果您不想设置它(或者您只是不需要,例如对于本地文件),您可以为源变量中的每个文件输入SKIP:sha512sums=("SKIP")package()这是最后一个一个,实际上是我们包中最重要的部分。处理这个问题时,重要的是要知道两个变量。${srcdir}:这是makepkg将文件放置在源变量中的位置。从此目录中,您可以与文件进行交互并对文件进行任何其他所需的修改。${pkgdir}:这是我们放置将在系统上安装的文件的地方。${pkgdir}的文件夹结构根据实际系统情况设置(例如用pacman安装时,${pkgdir}/usr/bin/hello-world会创建文件/usr/bin/hello-世界)。package()包含用于创建包的命令列表。因此,如果(假设)您需要在/usr/share/motto.txt中有一个文件,上面写着“Linux优于Windows”,您将运行如下命令:package(){mkdir-p"${pkgdir}/usr/share"echo"LinuxissuperiortoWindows"|tee"${pkgdir}/usr/share/motto.txt"}上面命令的一些解释:${pkgdir}最初不包含目录。如果跳过mkdir命令,tee会输出一个错误,说该目录不存在。指定目录时,始终在它们前面加上${pkgdir}或${srcdir}变量。如果您输入/usr/share/motto.txt,它将直接指向您当前运行的系统中的/usr/share/motto.txt。对于您的PKGBUILD,您将把hello-world.sh文件放在目标系统上的/usr/bin/hello-world中。您还将使文件说“你好!”运行时。为此,请在PKGBUILD中输入以下内容:package(){echo'Hellotoyou!'>"${srcdir}/hello-world.sh"mkdir-p"${pkgdir}/usr/bin"cp"${srcdir}/hello-world.sh""${pkgdir}/usr/bin/hello-world"chmod+x"${pkgdir}/usr/bin/hello-world"}完成!使用makepkg-si构建并安装包,然后在终端中运行hello-world以查看其输出。总结就是这样,你已经制作了你的第一个PKGBUILD!您正在为自己或什至为AUR制作一个实际的包。问题,或者有什么不对?请随时将它们发布在下面的评论部分。