Home / Blog / 工具
Tech · 工具

fpm 打包工具

H by Haofly
· 2016-08-07 · updated 2019-10-21 · 72 views

fpm打包工具

安装过程

yum install -y rpm-build ruby-devel virtualenv gcc
pip install virtualenv-tools 
gem install -V fpm
fpm -h

常用参数

  • -a: 架构名称,值可以为 x86_64
  • —config-files: 指定配置文件,可以指定多个。需要注意的是并不是所有文件都适合以配置文件的方式放入包中,不要将动态的文件放入配置文件中
  • -d ‘名称’: 指定程序依赖,多个依赖的话就写多个-d
  • —debug:打印编译时的详细日志
  • -C: 指定在打包前需要进入的目录(打包时的相对路径),相当于把那个目录打包
  • -n: 包名
  • -s: 源的类型,值可以为dir,rpm,gem,python,virtualenv,empty,tar,deb,cpan,npm,osxpkg,pear,pkgin,zip
  • -t: 目标类型,值可以为rpm,deb,solaris,puppet,dir,osxpkg,p5p,puppet,sh,solaris,tar,zip
  • -epoch 0,比-v更优先级的一个版本号
  • -v: 版本号,例如1.0.0
  • —iteration 1: 比-v更低优先级的一个版本号
  • —rpm-dist el7: 定义系统的迭代版本,el6表示centos6el7表示centos7,会生成在包名中,例如: example-0.1.0-el7.x86_64.rpm
  • —before-install, —pre-install 名称.sh: 安装前执行的脚本
  • —after-install, —post-install 名称.sh: 安装后执行的脚本
  • —before-remove, —pre-uninstall 名称.sh: 卸载前执行的操作
  • —after-remove, —post-uninstall 名称.sh: 卸载后执行的操作
  • -p, —prefix=目录: 指定软件之后要安装的路径
  • —description ‘这里写描述’
  • —url: 软件的网官网
  • —license ‘2-clause BSD-like license’:
  • —vendor: 供应商名称
  • —verbose: 打印详细安装过程
  • -m, —maintainer: 维护者
  • —rpm-sumarry: 简介
  • —description: 详情
  • usr=/,以这种方式,可以直接将当前目录下的目录在打包后放到指定的目录,例如,这里将工程目录下的uer目录放到了打包后的根目录,这样usr下的所有文件或文件夹都会被递归地打入包中。

以Virtualenv的方式打包Python包

相比与-s python的方式,将源设置为virtualenv(即-s virtualenv)的好处是不会破坏系统本身的python环境,不会与已经安装的包或者其他程序依赖的包产生冲突。举例,有一个需要打包的python包源码目录结构为:

.
├── Pipfile			# 自己开发时使用的是pipfile进行依赖管理,当然对fpm打包没有影响
├── Pipfile.lock
├── README.md
├── etc				# 一些典型的配置文件
│   ├── logrotate.d	# 日志轮转配置文件
│   │   └── my-agent
│   ├── rc.d		# 系统服务配置文件,该文件编写方式有点特殊,可以去谷歌一下
│   │   └── init.d
│   │       └── my-agent
│   └── my-agent	# 程序本身配置文件
│       └── default.conf
├── usr        # lib文件默认会被加入/usr/lib中,所以,这里直接以目录树形式存储
│   └── lib
│       └── my-agent
│           └── agent.state
├── scripts
│   ├── my-agent-after-install.sh
│   └── my-agent-before-remove.sh
├── setup.py		# 正常打python egg包所需要的文件,里面定义了包的一些元信息
└── src				# 程序源码
    ├── xxx.py
	└── __init__.py

然后使用这样的命令进行打包

fpm \
	--debug \
	-s virtualenv \		# 指定以virtualenv的形式进行打包
	-t rpm \
	-n my-agent \
	-a 'x86_64' \
	-v 0.1.0 \
	--license '2-clause BSD-like license' \
	--vendor 'Hao inc.' \
	--category 'System Environment/Daemons' \
	-m 'haofly' \
	--config-files etc/my-agent/default.conf \
	--config-files etc/logrotate.d/my-agent \
	--config-files etc/rc.d/init.d/my-agent \
	--after-install ./scripts/my-agent-after-install.sh \
	--before-remove ./scripts/my-agent-before-uninstall.sh \
	--url 'https://haofly.net' \
	--rpm-summary 'rpm summary.' \
	--description 'package description' \
	--prefix /usr/share/my-agent \	# 指定安装目录,如果不指定会默认安装到/usr/share/python/下面
	.

其他相关命令

rpm localinstall 包名 # 在新的机器上安装该软件
rpm -qpl 包名  # 查看包的信息

打包nginx例子

这是我打包tengine的命令fpm -s dir -t rpm -n tengine -v 2.1.2 -C /etc/nginx -d 'pcre-devel' -d 'openssl' -d 'openssl-devel' --before-install /share/before-install.sh --after-install /share/after-install.sh --before-remove /share/before-remove.sh --after-remove /share/after-remove.sh --description 'Haofly first fpm package' --url 'http://haofly.net' --prefix=/etc/nginx

Haofly · 豪翔天下 · 2016-08-07

评论 · Comments

评论由 Giscus 提供,需用 GitHub 账号登录;留言会同步到这个仓库的 Discussions 里。