• Go 程序打成 rpm 包


    1. 环境准备

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

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

    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
    
    • 1
    • 2

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

    $ go-bin-rpm --version
    go-bin-rpm version 1.0.0
    
    • 1
    • 2

    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": ""
        }
      ]
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

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

    • 二进制文件
    • service 文件
    • 配置文件(如果需要的话)

    其中 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

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

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

    如果在不同的平台或系统有不同的二进制,则可以准备多个 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

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

  • 相关阅读:
    小红书和中兴笔试
    【优化调度】基于蜜蜂和差分进化算法求解资源受限项目调度问题附matlab代码
    linux系统编程3—文件存储函数
    ChatGLM系列六:基于知识库的问答
    大数据技术-Hudi学习笔记
    设计模式:外观模式(C++实现)
    R语言隐马尔可夫模型HMM识别不断变化的市场条件
    (JavaSE)抽象类和接口
    深入解析Nacos:服务发现、配置管理与更多特性解析
    内存泄漏定位工具之 valgrind 使用
  • 原文地址:https://blog.csdn.net/Edu_enth/article/details/128119057