我们有一个通过RPM分发的产品.我们创建了SUSE SLES10 SP1 RPM和RedHat 5.5 RPM.两者之间存在差异,如果在RedHat机器上安装SUSE RPM,反之亦然,事情将无法正常工作(通常是神秘的).
有没有办法阻止RedHay RPM安装在SUSE系统上,反之亦然?我搜索了这个并找到了http://www.rpm.org/max-rpm/ch-rpm-multi.html,但这里的所有约束似乎都是基于命令的输出uname而不是告诉你是否你正在运行RedHat或Suse.操作系统是Linux,架构是一样的.
我们有想法在安装脚本中添加检查,可以在/ etc/issue文件中查找"Red Hat"或"SUSE",但我真的希望有比这更好的选项.
有下一种问题。想要重建垃圾收集器 (gc-7.1-10.el6.src.rpm) 并排除 ld-linux.so.2, ld-linux.so.2(GLIBC_2.3) & libpthread.so.0(GLIBC_2.3.2) ) 依赖项。我怎样才能得到我想要的类似的东西? (CentOS 6)
% rpm -qp -R rpmbuild/RPMS/i386/gc-7.1-10.el6.i386.rpm
/sbin/ldconfig
/sbin/ldconfig
ld-linux.so.2
ld-linux.so.2(GLIBC_2.3)
libc.so.6
libc.so.6(GLIBC_2.0)
libc.so.6(GLIBC_2.1)
libc.so.6(GLIBC_2.1.3)
libc.so.6(GLIBC_2.2.4)
libc.so.6(GLIBC_2.3)
libcord.so.1
libdl.so.2
libdl.so.2(GLIBC_2.1)
libgc.so.1
libgcc_s.so.1
libgcc_s.so.1(GCC_3.0)
libgcc_s.so.1(GCC_3.3.1)
libgccpp.so.1
libm.so.6
libpthread.so.0
libpthread.so.0(GLIBC_2.0)
libpthread.so.0(GLIBC_2.1)
libpthread.so.0(GLIBC_2.2)
libpthread.so.0(GLIBC_2.2.3)
libpthread.so.0(GLIBC_2.3.2)
libstdc++.so.6
libstdc++.so.6(CXXABI_1.3)
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(VersionedDependencies) <= 3.0.3-1
rtld(GNU_HASH)
Run Code Online (Sandbox Code Playgroud)
我需要编辑我的规范文件,或者更改和重建我的 tar.gz 档案吗?
我正在尝试在Fedora 15中创建一个安装我的软件的RPM,但是为了让我的软件在安装后正常工作,我还需要编辑系统上的其他(配置)文件,添加用户/组等.只有root用户才能执行其中一些任务.我知道永远不会以root用户身份创建RPM,我理解为什么这是一个糟糕的主意.但是,如果我将shell脚本语句添加到我的spec文件(%post,%prep ... any section)来编辑必要的文件,添加用户/组等,我的rpmbuild命令将失败并显示消息"Permission denied"(不出奇).
处理这个问题的最佳方法是什么?我是否必须先告诉我的用户安装我的软件包,然后以root身份运行shell脚本来配置它?这似乎并不优雅.我希望允许用户使用一个简单的命令来完成所有操作,例如"yum install mysoftware".
我的大部分研究表明,或许这甚至不应该通过RPM完成.我已经阅读了最大RPM的许多部分,以及许多其他好的资源,但还没有找到我正在寻找的东西.我是创建RPM的新手,但已经能够为我的软件成功创建一个简单的spec文件......在解压缩包并安装到正确的位置后,我无法正确配置所有内容.任何输入都非常感谢!
rpmbuild可以通过查找包中包含的二进制文件所需的共享库来自动检测依赖项,虽然这几乎是每次都很好的思考,但是有时候它是不受欢迎的,但仅限于某些特定的库.我指的是一些二进制文件需要通过其rpm包管理未提供给系统但由第三方安装程序直接安装的库的情况.
现在,问题是:有没有办法让自动检测功能保持活动状态(对于包中的其他二进制文件很方便)但是忽略/删除这些特定的库?
就像是
AutoReqIgnore : library1
AutoReqIgnore : library2
Run Code Online (Sandbox Code Playgroud) 我是编写规范文件和构建RPM的新手。目前,我有一个RPM,应该将某些文件部署在2个可能的目录中的1个中,这些目录会随操作系统的不同而不同。
如何在%files部分中验证它们?我不能使用变量...我无法验证两个路径,因为肯定会失败...我试图在%install部分的较早位置定义一个宏,但该宏只会被定义一次,不会被重新定义在每个RPM安装上...
我在这里可以做什么?
谢谢
我正在尝试在OSX上设置一个maven项目,并使用它rpm-maven-plugin来构建它作为RPM包.但是,即使最简单的插件配置似乎也失败了.我得到的错误是Bad exit status from /usr/local/Cellar/rpm/5.4.10/var/tmp/rpm-tmp.50667 (%install).详细输出不会提供太多信息.生成的spec文件如下所示:
Name: server
Version: 1.0
Release: SNAPSHOT20130920084527
Summary: MySummary
License: 2013 MyCompany
Distribution: MyDistribution
Group: Application/SomeGroup
Packager: me
autoprov: yes
autoreq: yes
Prefix: /app/theapp
BuildRoot: /Users/me/Projects/projectname/server/target/rpm/server/buildroot
%description
My Description
%install
if [ -e $RPM_BUILD_ROOT ];
then
mv /Users/me/Projects/projectname/server/target/rpm/server/tmp-buildroot/* $RPM_BUILD_ROOT
else
mv /Users/me/Projects/projectname/server/target/rpm/server/tmp-buildroot $RPM_BUILD_ROOT
fi
%files
%defattr(644,-,-,755)
"/"
Run Code Online (Sandbox Code Playgroud)
构建RPM的命令是 /usr/local/bin/rpmbuild -vvv -bb --target noarch --buildroot /Users/me/Projects/projectname/server/target/rpm/server/buildroot --define '_topdir /tmp' server.spec
我不确定它是OSX问题还是一般的rpm-maven-plugin问题,但我怀疑它是OSX问题,因为我在其他平台上使用rpm-maven-plugin构建RPM.
有没有其他人成功使用过rpm-maven-pluginOSX?
编辑
我正在使用rpm-maven-plugin2.1-alpha-3,OS X 10.8.4并通过自制软件安装rpm.我还验证了相同的配置适用于CentOS Vagrant盒子.
我想将最后一个"git commit id"添加到我的rpms中,以便有一种简单的方法来跟踪用于构建包的源代码.
我可以使用rpm release标记,但是在快照的情况下,这已经用于版本号和日期.我不想进一步超载这个.
是否有另一个标记或机制来存储rpm中的最后一个commit-id?
我正在使用专有代码库,所有者希望用户获得有用的堆栈跟踪信息,但无法查看源代码。生成带有调试符号但没有源代码的Debian dbg软件包很简单,但是Redhat debuginfo RPM是自动使用源代码创建的。
有没有一种方法可以配置rpmbuild来构建不带源代码的debuginfo RPM?
如果不是,从debuginfo包中删除源代码的最佳方法是什么?有人有脚本吗?
我有一个用于构建rpm软件包的规范文件,在我的%install部分中,我具有以下内容:
%install
install -m 700 foo/bar/filesToCopy/. $RPM_BUILD_ROOT/
Run Code Online (Sandbox Code Playgroud)
filesToCopy文件夹是一棵树,与打包文件树的外观完全一样。它具有软件包具有的所有子目录,例如etc /...、/ usr / bin,/ usr / share ...,以及这些文件中的后续文件。
建立时给我
install: omitting directory 'foo/bar/filesToCopy/'
error: Bad exit status from /var/tmp/rpm-tmp.sea6XO (%install)
Run Code Online (Sandbox Code Playgroud)
有没有一种方法我不必像这样单独复制每个文件:
install -m 700 foo/bar/filesToCopy/usr/bin/file1.ex $RPM_BUILD_ROOT/usr/bin/
...
Run Code Online (Sandbox Code Playgroud)
由于filesToCopy /中的所有内容都是$ RPM_BUILD_ROOT /中的结构
更新
我找到了解决方法,将“ install -m 700”更改为“ cp -a”
import os
from setuptools import setup
from distutils.command.install import install as _install
def _post_install(dir):
from subprocess import call
call([sys.executable, 'post_script.py'],
cwd=os.path.join(dir, 'script_folder'))
class install(_install):
def run(self):
_install.run(self)
self.execute(_post_install, (self.install_lib,),
msg="Running post install task")
VERSION = '123'
setup(name='XXXX',
description='hello',
url='http://giturl.com',
packages=['package_folder'],
cmdclass={'install': install},
package_data={
'package_folder': [
'*.py',
'se/*pp'
],
},
)
Run Code Online (Sandbox Code Playgroud)
#基本上我应该在安装正在构建的rpm后执行postscript.它不起作用.这样的任何其他方法都不起作用?