我正在尝试使用rpmbuild执行以下操作。
我有一个预先构建的项目,在一个目录中大约有100个文件,作为tar文件。我想创建一个将这些文件打包的RPM,当使用RPM-I安装到新机器上时,将解包这些文件,在/usr/bin下创建一个目录,并将它们复制到其中。最后,它应该运行bash脚本文件。
运行rpmbuild-bs会创建一个SRPM,但是当我尝试用rpm-I安装它时,什么都不会发生。
运行rpmbuild-bb将运行所有步骤-配置、构建、安装等,其中大部分我不需要。但是,它不会创建RPM,而且安装步骤是我在使用RPM-I时预期在目标计算机上发生的,而不是在我试图在其上创建RPM的计算机上。
我想我错过了一些基本的东西。有什么线索吗?
最佳答案
运行rpmbuild-bs会创建一个SRPM,但是当我尝试安装它时
使用rpm-i,什么都不会发生。
不是什么都没有。成功安装SRPM会将规范文件和源(包括修补程序)安装到您的RPM构建树中,以便您使用它构建RPM。不过,这可能只是用相同的副本覆盖了原始源代码和规范,具体取决于您在何处构建它以及安装它的用户。SRPM并不是你想要的,尽管你仍然应该创建一个供将来使用的SRPM。
运行rpmbuild-bb运行所有步骤-配置、构建、安装,
等等,大部分我不需要。
当然,但是你不需要的步骤不需要做任何事情。听起来你可以用一个空的%build
scriptlet,也可以用一个空的%prep
scriptlet,如果你知道怎么做的话。大部分工作可以在%install
中完成,这很好。
但是,它不会产生转速,
那将是令人惊讶的。你确定你找对地方了吗?它将进入您的RPM构建区域中RPMS/
的相应arch特定子目录。例如,RPMS/x86_64/mypackage-1.2.3-1.x86_64.rpm
。
当然,前提是rpmbuild
成功。它在%install
阶段后可能会因各种原因而失败,但如果失败,它会发出诊断信号。
安装步骤是我期望在目标上发生的
机器当我使用rpm-I时,不是在机器上我试图创建
转速开启。
好吧,这在一定程度上取决于您如何在规范中编写install scriptlet。如果您编写正确,那么它将安装要打包到由rpmbuild
指定的暂存区域中的文件。
我想我错过了一些基本的东西。有什么线索吗?
我认为你遗漏了几个基本的东西:
生成RPM的规则1:不要将RPM生成为根目录!如果您说install步骤执行了您希望rpm -i
执行的操作,则表示您违反了此规则。只有在以根用户身份构建时,rpmbuild
才有可能将文件写入系统目录。
scriptlet(您在spec文件中提供的)应该将文件写入根在rpmbuild提供的构建根上的文件系统映像,而不是写入根在实际文件系统根上的主树。scriptlet可以通过%install
宏或%install
shell变量识别构建根。scriptlet应该创建该目录及其所需的任何子目录,并在其中写入要安装的文件。
可以提供脚本以在包安装和/或删除时运行,这些脚本非常常见,但请确保您的脚本只在安装包的文件后在目标系统上执行。例如,创建本地用户和配置系统服务。不要使用这样的scriptlet来执行任何您可以直接烘焙到包中的操作,例如设置文件所有权或权限或修改文件。
总的来说,听起来你想要这样的东西:
Name: mypackage
Version: 1.2.3
Release: 1%{?dist}
Summary: My package
License: proprietary
Source0: mypackage-1.2.3.tar.gz
# Only rather old rpmbuild requires you to choose a build root yourself
# BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
# You probably can let rpmbuild discover the dependencies for you
# Requires:
%description
My cool package.
%prep
# empty
%build
# empty
%install
# make sure to start clean
rm -rf %{buildroot}
# Create the buildroot and appropriate directory structure within
mkdir -p %{buildroot}%{_bindir}
cd %{buildroot}%{_bindir}
# Unpack the tarball directly into the build root.
# This is a bit unusual, but it works when your tarball contains pre-built
# binaries. The macro %{S:0} refers to source 0.
tar -xzf %{S:0}
# Optionally move / rename the unpacked directory or its contents
mv mypackage-1.2.3 mypackage
%files
# Installed files will be owned by root:root, but they will have whatever
# modes they do in the build root:
%defattr(-,root,root,-)
# Or whatever the install directory was, less the build root portion:
%{_bindir}/mypackage
%post
# post-installation script inline here ...
# Can use the installed files, including running scripts among them.
# Make sure that this script cannot exit with a nonzero exit status.
%changelog
* Fri Jun 08 2018 user3587642 <user3587642@mail.com> 1.2.3-1
- Initial spec
关于linux - rpmbuild规范文件和rpm-造成一些困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50753033/