从rpm包中提取spec文件

jon*_*jon 37 linux rpm rpmbuild rpm-spec

有没有办法从rpm包中提取spec文件(我只有RPM文件)

不是

   rpm --scripts -qp my-great-app-1.1.2.rpm 
Run Code Online (Sandbox Code Playgroud)

(这种语法只能从rpm获取spec脚本中的脚本)

rei*_*art 24

安装rpmrebuild并解压缩rpm 文件或已安装的软件包的spec文件.

例子:

rpmrebuild --package --notest-install -e oracle-instantclient-basic-10.2.0.4-1.x86_64.rpm
rpmrebuild -s hercules.spec hercules
Run Code Online (Sandbox Code Playgroud)

  • 查看rpmrebuild的代码然后实际测试它,它不会"提取"spec文件; 它重新生成大部分spec文件(标题,日志,前/后脚本).但是,重要的是,它实际上并没有得到%prep或%build部分; 它只是保留它们的默认值(分别是"make clean"和"make install").我怀疑这是因为///信息没有存储在RPM中.因此,虽然这应该适用于最常见的情况,但它看起来并不普遍适用(特别是对于具有复杂编译步骤的包).:/ (11认同)

dan*_*uer 15

spec文件不存储在二进制rpms中,除非打包器由于某种原因明确包含它(并且实际上没有理由这样做).您可以从二进制rpm获得的唯一信息是rpm -qi <package>返回的信息以及rpm -ql <package>列出的文件.如果您需要更多,则必须找到源包.如果Google /供应商的网站未能为您提供,则应在Packager字段中提供联系信息,以供任何主管人员打包.例如,这是RHEL附带的软件包和第三方供应商提供的软件包:

$ rpm --qf '%{Packager}\n' -q redhat-release
Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
$ rpm --qf '%{Packager}\n' -q cfengine-community
CFEngine AS (packager@cfengine.com)
Run Code Online (Sandbox Code Playgroud)

你有一个网站和一个电子邮件地址,你可以在那里询问spec文件或srpm文件.


Rum*_*kin 8

spec文件通常不是rpm.它们处于源rpm.

  • 那么如何从srpm中提取它们? (5认同)

kam*_*mal 8

你可以用

yumdownloader --source < something.rpm
Run Code Online (Sandbox Code Playgroud)

然后:

rpm2cpio packagename | cpio -ivd
Run Code Online (Sandbox Code Playgroud)

  • 这只会获取将要安装的文件,而不是spec文件. (5认同)

Ric*_*ith 8

根据@ RumpleStiltskin的回答,原始的spec文件可以在源rpms中找到,可以提取.要获取源rpms,请运行以下命令:

yum install yum-utils # Only required if yumdownloader is not installed
yumdownloader --source <package name, like 'emacs-nox'>
Run Code Online (Sandbox Code Playgroud)

这会将程序包安装到当前目录.提取它运行:

rpm2cpio <package name>.src.rpm | cpio -civ '*.spec'
Run Code Online (Sandbox Code Playgroud)

.spec文件将位于当前目录中.

如果由于某种原因无法安装yum-utils,请查看文件/etc/yum.repos.d/并查找引用源rpm存储库的部分.您可以在baseurl浏览器中键入值并手动搜索源包.提取.spec仍然需要rpm2cpio.


小智 5

rpmrebuild是你的朋友.使用

rpmrebuild -e -p <rpm_file>
Run Code Online (Sandbox Code Playgroud)

当它在编辑器中打开spec文件时,您也可以更改rpm规范.