首页 > 解决方案 > 如何在构建过程中从 rpm 运行 shell 脚本?

问题描述

基本上我希望我的构建过程能够做到这一点:

  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

标签: rpmrpmbuild

解决方案


你需要:

  • 为您的用户设置构建树,例如运行rpmdev-setuptree
  • 将源文件SOURCES放在构建树中
  • 声明一些Source标签。这对于正确构建至关重要。因为这是您在构建期间引用构成构建的文件的方式。

例如

Source0: process.sh
Source1: util.tar.gz

可以是所有大量 CSV 文件的util.tar.gztarball(我假设文件太多,因此为每个文件单独输入一个条目是不可行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,但这是仍然要走的路。


推荐阅读