快速通过AUR或者OBS构建一个软件包
这个文章只是简要介绍一下使用OBS构建软件包的基本方法,以及AUR与OBS在编写时候的对应关系。编写一个规范且更易维护的软件包要比这里边提到的关注点要多。
一、什么是OBS
开放构建服务(Open Build Service)是一个通用的系统,以自动、连贯和可重复的方式从源代码构建和分发软件包。它可以为各种操作系统和硬件架构发布软件。我们用来构建发行版的 OBS 参考服务器目前(2018 年 6 月)已有 53219 个项目,其中包含了 79794 个仓库中的 468316 个软件包,用于众多发行版和架构,并由 53171 个已确认的开发者使用。
资料来源于Portal:构建服务 - openSUSE Wiki
二、什么是AUR
Arch 用户软件仓库(Arch User Repository,AUR)是为用户而建、由用户主导的 Arch 软件仓库。AUR 中的软件包以软件包生成脚本(PKGBUILD))的形式提供,用户自己通过 makepkg) 生成包,再由 pacman) 安装。创建 AUR 的初衷是方便用户维护和分享新软件包,并由官方定期从中挑选软件包进入 community 仓库。许多官方仓库软件包都来自 AUR。通过 AUR,大家相互分享新的软件包生成脚本(PKGBUILD) 和其他相关文件)。用户还可以为软件包投票。如果一个软件包投票足够多、没有协议问题、打包质量好,那么它就很有希望被收录进官方 community 仓库(以后就可以直接通过 pacman 或 abs 安装了)。
资料来源于Arch User Repository(简体中文)
三、快速通过OBS构建一个软件包
以我打包的electron-wechat为例。
一切的基础,是需要你拥有一个OBS账号并登录。前往OBS官网注册并登录,你就拥有你的工作空间了。
通过Create Package
,来创建一个软件包目录,并将源码上传到这个目录中。但要注意的是,OBS构建的服务器是不联网的,所以对于electron-wechat这种nodejs的程序,由于通过npm命令进行构建的时候一定会去往nodejs官网检索相关依赖的最新版本,所以对于这种程序,最简单的办法就是直接上传编译好的文件进行分发。
这里想补充一下:已经在自己的电脑上编译好了,那就已经可以使用了,为啥还要使用OBS打包呢?很简单,因为自己编译出来的东西是零散的,需要手工把文件放到对应的位置上去,而且没有一个统一的卸载方法。通过OBS打包之后,就可以进入到软件源中,直接通过统一的安装/卸载指令来使用一个软件了。
所以对于electron-wechat,我就是在本地编译好了之后,将二进制文件打包成tar.bz2,上传到了打包目录。
之后,编写spec文件。这个文件告诉了OBS到底都需要干什么来完成打包。
在打包目录下新建软件包名.spec
,开始填空。(如果使用openSUSE的vi编辑器直接新建的话,会直接生成一个.spec文件的模板,填空即可。)
- Name: 软件包名
- Version: 软件包版本
- Release: 使用默认即可
- Summary: 一句话介绍
- License: 许可证类型
- Group: 软件类别
- Url: 项目地址
Source: 源码地址
如果有多个源码,可以通过Source0 Source1 依次指定。参考我打包的dingtalk
- Provides: 提供的内容
- Obsoletes: 排斥的内容
然后,在%description下写一个比较详细的软件介绍,不主要的部分就写完了。
之后,%prep下写入打包要做的准备工作。比如解压缩源码包。对于以软件包名-版本号.tar.bz2
形式的包,默认的%setup -q
即可完成解压。其他命名方法的bz2,需要补充 -n 参数。即setup -q -n 包名
如果还有其他要解压之类的工作,一并写在这个下面,可以参考rpm打包的宏,如果不熟悉,也可以使用bash命令代替。
准备工作做好,填写%build编译部分。对于一般的C语言,可以上传源码包,在%build填写编译的指令。而对于nodejs这种无法通过编译的软件,由于上传的就是编译好的二进制文件,所以编译这部分留空。
%install指示了编译出来的所有文件都要放到什么地方。这里相对比较简单理解,就是通过bash命令,把编译出来的文件依次复制到它应该在的位置即可。至于具体应该在什么位置,就要看一看Linux的标准了。如果不确定的话,把所有文件放在/opt/软件名
这个文件夹下也未尝不可。这种做法并不标准,但很快。不过即使如此操作,也需要注意desktop桌面入口文件和图标文件一定要放置在它应该在的位置,否则在图形界面一定会找不到启动的按钮,图标显示也会有问题。%post -p /sbin/ldconfig
和%postun -p /sbin/ldconfig
两句话照抄即可。
之后,在%files下书写这个软件都拥有哪些文件和文件夹。宗旨就是产生了哪些文件,就把绝对路径写在这里。
到此,一个简易的spec文件就写好了。
之后的查错,可以通过OBS编译结果进行排查,根据报错进行修改即可。
四、AUR编写与OBS的异同
AUR与OBS非常类似,区别只在于OBS的spec文件命名是根据软件包名命名的,而AUR的文件叫做PKGBUILD
。所以在AUR建立一个软件工程后,直接新建一个PKGBUILD,在里边编写即可。
至于编写的内容,与OBS也很类似,只不过AUR是一个更纯粹的脚本,不能使用OBS里边诸如%prep这种宏来书写。
我的OBS仓库的dingtalk就是借鉴AUR的dingtalk-linux。可以对比着来看一看。
相对来说,AUR的编写更容易上手,但是相对OBS来说,编写出来的PKGBUILD通用性会差一些。不过无论哪种,思路都是类似的。看一看现有的文件写法,自己尝试一下就会了。