请教各位 C++的老哥,发布程序的时候,需要打成 rpm、deb 包吗?

2022-05-03 17:39:05 +08:00
 liuguangxuan

自己平时在工作中,发布或者更新 C++程序时,直接发布一个文件夹,里面包含了可执行程序和相关的依赖库。用户下载下来,替换更新。

请问各位老哥:

  1. 你们发布程序的时候会打包成 rpm 、deb 格式的包吗?如果打包的话用的是什么工具?如何检测 CentOS 、Ubuntu 等不同平台的?
  2. 打包发布程序的时候,如何和 systemd 配合,使用 systemctl 来管理?
  3. 行业里面,比较规范的做法是什么?
3824 次点击
所在节点    C++
28 条回复
iClass
2022-05-03 17:40:04 +08:00
比较规范的做法是 发布到 Github 开源
XiLingHost
2022-05-03 17:43:59 +08:00
用 ci/cd 做自动化构建,生成的制品可以发布到内网的 nexus 里
ZhiyuanLin
2022-05-03 18:37:25 +08:00
内部用的程序,建议全静态链接,用户自行下载个 binary 直接拷贝到 /usr/local/bin 或其他自己喜欢的路径,基本没有跨发行版兼容问题。内部使用的 binary 我个人倾向于不用系统包管理器安装,避免在打包者失误的情况下对系统造成什么影响。

systemd 按格式写个 service file 复制到相关路径即可。https://wiki.archlinux.org/title/systemd
BrettD
2022-05-03 18:51:42 +08:00
在目标机器上从源码编译
hetal
2022-05-03 18:59:17 +08:00
业务系统的话,最简单是用 docker 。
littlewing
2022-05-03 20:13:28 +08:00
全静态链接所有依赖,拿来啥都不用装就能跑的那种
adoal
2022-05-03 20:26:32 +08:00
真的想打包 rpm/deb ?那就是学 rpm 和 deb 的官方 guide 呗,学了之后第一个问题的后面两个问号和第二第三个问题都不值得问了。

不过内网环境里还要打成发行版包的团队不多。毕竟这种事不产生业务绩效,管理者一般是不在乎的,属于低性价比的行事方式。
adoal
2022-05-03 20:28:59 +08:00
workman2021
2022-05-03 20:31:14 +08:00
nfpm: https://github.com/goreleaser/nfpm 编译好的二进制文件 直接用这个打包成 deb,rpm 方便
jim9606
2022-05-03 23:07:58 +08:00
可以打包,因为有些自动部署会要求发布为 rpm/deb 。
尽量用静态链接,少用共享库,或者改 rpath 优先用本地共享库,不要像发行版那样搞七八个直接依赖,最好是只依赖 libc6 ,也尽量不要在安装 /卸载脚本里做任何编辑全局配置的事(例如 sed 修改 sysctl.conf 和 ld.so.conf )。
目录的话一般不要混在 /usr 下面,在 /opt 下面按 app 名建目录比较好,或者看 SA 的建议。
Chipmunker
2022-05-03 23:23:30 +08:00
既然是 c++项目,可以直接用 cmake 来打包啊。多平台支持。
timpaik
2022-05-04 00:05:53 +08:00
当然是打 docker 镜像?
mingl0280
2022-05-04 01:36:34 +08:00
Windows:InstallShield 或者 NSIS ,
Linux:不打包,.tar.gz+安装脚本。
懒得搞那些打包啥的……
systemctl 并不管程序包,那是 dpkg 之类的包管理器管。
行业内并没有“比较规范的做法”,都是各家自己看着办,不然哪来的那么多软件包安装套件啥的……
liuguangxuan
2022-05-04 08:30:38 +08:00
@Chipmunker #11 感谢老哥回复,我第一反应也是用 cmake 的 cpack 打包,但是没有找到检测 Linux 发行版的方法,最后用的是读取`/etc/os-release`文件,根据关键字来判断。

打成 rpm 包,并配合 systemd 参考的是 https://github.com/andrew-hardin/cpack-systemd-demo 这篇教程,但是没有找到同时兼顾 Linux 多种发行版的打包教程,老哥能否指点一下,给个用 cmake 打包,配合 systemd ,同时兼顾不同发行版的优雅点儿的方式或者教程?
nightwitch
2022-05-04 09:42:57 +08:00
打包并不是很方便。。尤其是对于企业工作场景,即使是开发者都可能没有 root 权限,不能随便安装包。
打成 tar.gz 就差不多了,用户可以放到自己的$HOME 目录。
deb 文件本质上就是 tar.xz 。只是里面的路径不同
adoal
2022-05-04 19:51:09 +08:00
对了,OP 你为啥执着于检测发行版?而且你所谓的检测发行版是在打包时检测,还是装包时检测,还是运行时检测?

打单个包兼容多种发行版还是不太现实的,不是社区的常规做法。一般是针对不同发行版、不同版本单独打包。可以在独立的目标版本机上打,也可以临时拉一个 docker 进去打。虽然版本不行,但 rpm spec 或者 debian rules 未必不同(当然,而已有可能不同),不同的是打出来的包的依赖而已。

另外还想问一下 OP ,你打包的目的到底是啥,你在公司里是什么角色,公司的 IT 基建环境怎么样……如果是纯开发的话,自己去想打包问题可能会有点累又自作多情,还是跟基建组的同事商量一下吧。
adoal
2022-05-04 19:51:40 +08:00
虽然版本不行 => 虽然版本不同
Chipmunker
2022-05-04 21:01:57 +08:00
@liuguangxuan OP 你好。我感觉你要实现的效果和各大厂商的在 Linux 端的闭源程序做法有点像啊!例如 Wolfram Mathematica 程序及 NVIDA 的驱动等。他们就是发布一个单个的二进制文件,在不同发行版下都是通用的。

我不太清楚他们的具体实践如何,我推测了一个类似的操作,或许可以实现相近的效果:
1. 首先按照预设运行平台,使用 cmake 中的 cpack 来生成对应平台的包( rpm, deb );
2. 编写安装脚本,其中包含判断平台,安装对应平台的包到系统,执行 systemd 操作之类的;
3. 将包和脚本组合在一起,生成单个可执行文件。这里有一个简单示例: https://blog.zhenglin.work/linux/how_to_made_bin.html

以上只是我的设想,没有具体操作过,不知是否能够完美实现 OP 需求。
liuguangxuan
2022-05-04 23:18:24 +08:00
@adoal #16 检测发行版的目的:有的用户是 CentOS ,有的是 Ubuntu ,所以有了想检测发行版的想法。最初的想法打包时检测,分别打成不同的包,CentOS 的用户就给 rpm 包,Ubuntu 用户就给 deb 包。

rpm 的 spec 我研究了一下,好像最终是使用 rpmbuild 来打包,debian 的 rules 还没来得及研究。

关于打包目的和在公司的角色:我在公司是开发,因为人手不够,所以兼顾运维、写文档等等。至于公司的 IT 基建环境,可以说为 0 ,没有任何规范,一切都靠自己,所以只能摸索前进。我看到很多开源的工具都提供 rpm 包,就想着这个可能就是发布程序的最佳实践,就想学习一下,然后应用到公司以后发布程序中。

另外没有进过大厂,也不知道大厂的分工,这是我第一次听基建这个词,老哥能否介绍一下大厂的各个部门,以及各个部门的职责。
liuguangxuan
2022-05-04 23:29:09 +08:00
@Chipmunker #18 感谢老哥,发的这个链接,感觉里面思路有点儿清奇,是个办法。

但是我想做的其实就是你说的第一步,“首先按照预设运行平台,使用 cmake 中的 cpack 来生成对应平台的包( rpm, deb )”,我想实现的是 cmake 自动能识别平台,比如为 CentOS 或者 Ubuntu ,然后分别达成 rpm 包,或者 deb 包。老哥有没有推荐的教程啊?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/850661

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX