从当前目录构建RPM,解决src.rpm中子目录内容为空的问题
问题解决步骤
问题根因说明
rpmbuild原生不支持直接将目录作为Source递归打包进src.rpm,直接指定目录为Source时,rpm仅会打包空目录到src.rpm,这就是Source1为空的根因。
方案实现
第一步:将项目整体打包为单源码包
在Git仓库根目录执行以下命令,将所有代码和配置文件打包为压缩包,自动递归包含clearshare子目录下的所有内容:
tar czf clearshare-0.0.1.tar.gz *
执行后会生成clearshare-0.0.1.tar.gz文件,所有嵌套文件、clearshare/bin/clearsia二进制都在包内,不需要单独指定下层文件。
第二步:修改spec配置
修改后的spec内容如下:
Name: clearshare Version: 0.0.1 Release: 1%{?dist} License: Proprietary Summary: my clearshare program BuildArch: x86_64 # 仅需指定单源码包,无需拆分多个Source Source0: %{name}-%{version}.tar.gz Requires: rh-python38 %prep # 自动解压源码包,递归还原所有目录结构 %setup -q %install %define _VENV /var/clearos/envs/%{name}/lib/python3.8/site-packages rm -rf %{buildroot} mkdir -p -m 755 %{buildroot}%{_VENV}/%{name} # 直接从解压后的构建目录拷贝所有文件,无需引用多个SOURCE变量 cp -r clearshare %{buildroot}%{_VENV}/%{name} install -m 644 logging.conf %{buildroot}%{_VENV}/%{name}/ install -m 644 requirements.txt %{buildroot}%{_VENV}/%{name}/ install -m 644 setup.py %{buildroot}%{_VENV}/%{name}/ install -D -m 644 %{name}d.service %{buildroot}/usr/lib/systemd/system/%{name}d.service # 单独给clearsia二进制加执行权限 chmod 755 %{buildroot}%{_VENV}/%{name}/%{name}/bin/clearsia %clean rm -rf %{buildroot} %files %defattr(-,root,root,-) %{_VENV}/%{name}/%{name} %{_VENV}/%{name}/logging.conf %{_VENV}/%{name}/requirements.txt %{_VENV}/%{name}/setup.py %{_unitdir}/%{name}d.service
第三步:规避sources.download的sha256sum校验
构建系统要求的sources.download仅用于拉取外部远端源,生成的clearshare-0.0.1.tar.gz属于本地内置源码,按以下操作即可规避校验:
- 提交构建任务时,将
clearshare-0.0.1.tar.gz和spec文件一起放到构建系统的SOURCES目录下 - sources.download文件不需要添加该tarball的条目,绝大多数RPM构建系统检测到Source文件已在本地存在时,会自动跳过拉取和sha256sum校验流程
如果构建系统强制要求所有Source必须在sources.download中登记,可在提交构建前动态生成sha256sum:
# 生成tarball后自动计算hash写入sources.download echo "sha256:$(sha256sum clearshare-0.0.1.tar.gz | awk '{print $1}') clearshare-0.0.1.tar.gz" >> sources.download
不需要提前获知hash值,打包时动态计算写入即可。
内容的提问来源于stack exchange,提问作者NickH
相关产品推荐
相关产品推荐

