Go 程序打成 rpm 包,也太简单了

共 2637字,需浏览 6分钟

 ·

2022-12-22 00:03



#
1. 环境准备


首先是 rpmbuild 的相关依赖,无论是什么语言写的程序,只要是打包成 rpm 包,就都需要这些



yum install -y gcc make rpm-build redhat-rpm-config


rpmbuild 的使用,需要你写不少的配置,非常繁琐,有研究过的人自然知道其中的泪。


但大多数情况下,一个简单的 rpm 包可能就只是执行一个二进制文件而已,完全没有去花费大量的时间去系统学习它们。


于是乎,有人就编写了一个开源工具 go-bin-rpm,用它可以很方便的将二进制文件打包成 rpm 包。


go-bin-rpm 的作者提供了多种安装方式


个人认为比较方便的是下面这条命令



wget -O - https://raw.githubusercontent.com/mh-cbon/latest/master/bintray.sh \
| GH=mh-cbon/go-bin-rpm sh -xe


执行完成后,可以使用 --version 命令查看是否安装成功



$ go-bin-rpm --version
go-bin-rpm version 1.0.0



#
2. 配置文件


go-bin-rpm 的配置文件是 rpm.json ,当然你也可以用其他文件名,我这里直接使用默认的,这样后面打包时就不用指定配置文件的名字。


rpm.json 的内容相当精简,且直观易懂,模板如下



{
  "name""you-service-name",  # rpm 包名称
  "version""0.0.1",
  "release""20221110",
  "arch""x86_64",
  "summary""",
  "description""",
  "license""iswbm.com",
  "url""https://gtihub.com/iswbm/!name!", # !name! 相当于变量,会取前面 rpm 包名称
  "files": [
    {
      "from""./bin/!name!",
      "to""/usr/local/!name!/",
      "base""",
      "type"""
    },
    {
      "from""./!name!.service",
      "to""/usr/lib/systemd/system/",
      "base""",
      "type"""
    }
  ]
}


如果你的 rpm 安装后是以 service 运行的,那 files 要包含如下几项内容:




  1. 二进制文件





  2. service 文件





  3. 配置文件(如果需要的话)



其中 service 文件的模板,这边也给出来



[Unit]
Description=
After=syslog.target network.target

[Service]

Environment=key=value
Type=simple
NotifyAccess=all
TimeoutStartSec=0
Restart=always
User=root
ExecStart=/usr/local/xxxx/bin/xxxx

[Install]

WantedBy=multi-user.target


一切准备好了,就可以使用如下命令



# VERSION 和 RELEASE 请对应替换
go-bin-rpm generate -o rpms/xxxx-$(VERSION)-$(RELEASE).rpm


如果在不同的平台或系统有不同的二进制,则可以准备多个 rpm.json,然后在打包时,使用 -f rpm.json 来指定配置文件。



#
3. 使用 Makefile


go-bin-rpm 的命令还是比较长,我习惯写一个 Makefile 来方便编译



VERSION = 1.0.0
RELEASE = $(shell date +"%Y%m%d")

.PHONY: build-go
build-go:
    go build -o ./bin/hello .

.PHONY: build
build: build-go
    sed -i "s/VERSION/$(VERSION)/g" rpm.json
    sed -i "s/RELEASE/$(RELEASE)/g" rpm.json
    mkdir -p rpms
    go-bin-rpm generate -o rpms/hellp-$(VERSION)-$(RELEASE).rpm


后面只要使用 make build 就可以直接一步实现 编译 + 打包 ,使用上更加顺手。





推荐阅读






福利



我为大家整理了一份
从入门到进阶的Go学习资料礼包
,包含学习建议:入门看什么,进阶看什么。
关注公众号 「polarisxu」,回复 

ebook

 获取;还可以回复「进群」,和数万 Gopher 交流学习。







浏览 59
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报