我如何在构建过程中从 rpm 运行 一个 shell 脚本?

How do I run a shell script from rpm during the build process?

基本上我希望我的构建过程这样做:

  1. 运行 一个 shell 脚本,它从 csv 文件中剥离数据并将它们组合成一个 csv。
  2. 然后将该脚本生成的 csv 输出打包到 rpm 中。
  3. 当 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

util.tar.gz 可以是所有大量 CSV 文件的 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

P.S。我知道对于初学者来说,将一些东西复制到 SOURCES 目录听起来有点不必要,但你已经在其他地方有了它,但这是继续前进的方式。