我正在尝试使用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运行所有步骤-配置、构建、安装,
等等,大部分我不需要。
当然,但是你不需要的步骤不需要做任何事情。听起来你可以用一个空的%buildscriptlet,也可以用一个空的%prepscriptlet,如果你知道怎么做的话。大部分工作可以在%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宏或%installshell变量识别构建根。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/

10-12 02:38
查看更多