rpm - 如何在构建过程中从 rpm 运行 shell 脚本?
问题描述
基本上我希望我的构建过程能够做到这一点:
- 运行一个 shell 脚本,从 csv 文件中剥离数据并将它们组合成一个 csv。
- 然后将该脚本生成的 csv 输出打包在 rpm 中。
- 运行 rpm -install 时,csv 文件(不是脚本)被放置在目标机器上的特定位置。
我对 RPM 很陌生,所以如果我在下面的代码中犯了错误,我很抱歉,但是在尝试构建或安装时它给了我几个错误。
我试图从源目录运行脚本
我对 rpm 的预期流量应该如何工作感到有些困惑。在测试中,我在同一台机器上构建和安装,但实际上它将在两台机器上。
当我运行下面的代码时,它是否会将我的源文件副本放入 .rpm 文件中?我想知道为什么它不起作用。(它说 process.sh 不存在)
Name: Test
Version: 1
Release: 1
Summary: Test
License: FIXME
%description
this is a test build
%prep
echo "BUILDROOT = $RPM_BUILD_ROOT"
mkdir -p -m777 $RPM_BUILD_ROOT/usr/local/bin/
cp /home/myuser/foo/util/* $RPM_BUILD_ROOT/usr/local/bin
cd $RPM_BUILD_ROOT/usr/local/bin/
./process.sh hosts.csv processed.csv
exit
%files
%attr(0777, root, root) /foo/processed.csv
解决方案
你需要:
- 为您的用户设置构建树,例如运行
rpmdev-setuptree
- 将源文件
SOURCES
放在构建树中 - 声明一些
Source
标签。这对于正确构建至关重要。因为这是您在构建期间引用构成构建的文件的方式。
例如
Source0: process.sh
Source1: util.tar.gz
可以是所有大量 CSV 文件的util.tar.gz
tarball(我假设文件太多,因此为每个文件单独输入一个条目是不可行Source
的。
然后:
- 在
%prep
您将提取的部分中%{SOURCE1}
。 - 在该
%build
部分中,您可以将它们组合成一个文件 - 在该
%install
部分中,您将安装组合文件
%prep
cp -p %{SOURCE0} .
tar zxvf %{SOURCE1}
# ...
%install
%{__mkdir} -p $RPM_BUILD_ROOT%{_datadir}/%{name}
%{__install} -m 644 -p processed.csv \
$RPM_BUILD_ROOT%{_datadir}/%{name}/
%files
%{_datadir}/%{name}/processed.csv
PS我知道对于初学者来说,当你已经在别处拥有它时,将某些东西复制到目录中听起来有点不必要的任务SOURCES
,但这是仍然要走的路。
推荐阅读
- swift - Swift - 如何计算字符串中特定字符的出现次数?
- c++ - 二维数组之和
- java - 给定总和的子集计数
- .net-core-3.1 - EmbeddedProvider.GetDirectoryContents 返回 0 个结果
- r - 如何在ggplot2中按组显示汇总统计信息
- android - 为 RecyclerView 中的偶数项设置背景颜色
- google-dfp - 使用文件加载的内部 gpt 脚本:协议
- python - 如何使用python在线检索信息?
- c - 使二进制文字看起来更清晰的分隔符
- python - 在 Python 3 中,我们如何模拟对对象属性的引用,使其使用尽可能简单和透明?