在RPM打包时,如何控制文件安装到指定目录可以通过SPEC文件的 %files
部分来实现。以下是一个更加详细的示例,并对其中关键部分进行解释:
Name: mypackage
Version: 1.0
Release: 1%{?dist}
Summary: Example package containing files in custom directories
License: GPL
Source0: %{name}-%{version}.tar.gz
BuildRoot: %{_tmppath}/%{name}-buildroot
%description
This is an example RPM package that installs files to specific directories.
%prep
%setup -q
%build
# Build commands go here, e.g., configure && make
%install
rm -rf $RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT/opt/myapp/bin
mkdir -p $RPM_BUILD_ROOT/etc/myapp/conf.d
cp -rp ./bin/* $RPM_BUILD_ROOT/opt/myapp/bin/
cp -rp ./conf/*.conf $RPM_BUILD_ROOT/etc/myapp/conf.d/
%files
%defattr(-,root,root,-)
%doc README.md LICENSE
%config(noreplace) /etc/myapp/conf.d/app.conf
%{_bindir}/%{name} # This will install the binary from 'bin' directory
%dir /opt/myapp/bin # This defines a directory structure
/opt/myapp/bin/* # All files in this directory will be installed
%changelog
* Mon Dec 30 2023 noreply@example.com - 1.0-1
- Initial release.
解释:
%install
部分:/opt/myapp/bin/
和 /etc/myapp/conf.d/
)。%files
部分:%defattr(-,root,root,-)
指定默认的所有者、组和其他权限属性。%doc
定义了文档文件,在安装包时会自动放置到系统的文档目录下。%config(noreplace)
指定了一个可配置文件,并设置为“noreplace”模式,这意味着如果用户已经修改过该文件,则在升级包时不替换用户的自定义版本。%{_bindir}/%{name}
是一个宏展开,它会将软件主程序按照系统标准的二进制目录(通常是 /usr/bin/
或 /usr/local/bin/
)进行安装。%dir /opt/myapp/bin
定义了一个目录结构,让RPM知道这是一个需要创建的目录,而不是一个普通的文件。/opt/myapp/bin/*
表示安装该目录下所有的文件到指定的目标位置。通过这种方式,当你运行 rpmbuild -bb mypackage.spec
命令时,生成的RPM包在安装时会把文件放到你指定的 /opt/myapp/bin
和 /etc/myapp/conf.d
等目录中。