openSUSE:打包多版本指南
即使 RPM 的标准行为始终将单个软件包更新到最高版本,但仍然可以在单个系统上同时安装多个执行相同或类似功能的程序。
例如,许多系统一次安装了多个文本编辑器。这为系统的用户提供了选择,允许每个用户根据需要使用不同的编辑器,但如果用户未指定特定偏好,则使程序难以选择要调用的编辑器。因此,可以并且应该定义一些标准,以便程序可以回退到这些标准。
软件包命名
对于同一软件的不同版本,请参考 openSUSE:软件包命名指南#同一软件的多个软件包。
维护默认命令和库
update-alternatives 机制
update-alternatives 软件包创建、删除、维护和显示构成 alternatives 系统的符号链接的信息。打包者可以使用此软件包在运行系统中定义默认应用程序,而不会与其他软件包发生冲突。
Name: vim
Requires(post): update-alternatives
Requires(postun): update-alternatives
%install
# create a dummy target for /etc/alternatives/vim
mkdir -p %{buildroot}%{_sysconfdir}/alternatives
ln -s -f %{_sysconfdir}/alternatives/vim %{buildroot}%{_bindir}/vim
%post
update-alternatives --install \
%{_bindir}/vim vim %{_bindir}/vim-normal 15
%post enhanced
update-alternatives --install \
%{_bindir}/vim vim %{_bindir}/vim-enhanced 20
%postun
if [ ! -f %{_bindir}/vim-normal ] ; then
update-alternatives --remove vim %{_bindir}/vim-normal
fi
%postun enhanced
if [ ! -f %{_bindir}/vim-enhanced ] ; then
update-alternatives --remove vim %{_bindir}/vim-enhanced
fi
%files
%_bindir/vim-normal
%_bindir/vim
%ghost %_sysconfdir/alternatives/vim
%files enhanced
%_bindir/vim-enhanced
%_bindir/vim
%ghost %_sysconfdir/alternatives/vim
在此示例中,如果选择了 vim-enhanced,则链接链将为:/usr/bin/vim -> /etc/alternatives/vim -> /usr/bin/vim-enhanced。斜体标记的链接由软件包本身提供。
update-alternatives 优先级处理在优先级在更新前后相同的情况下不会更新文件列表。如果您更新了从属列表或更改了文件的路径,则应提高优先级。
%postun 部分的构造是必需的,原因如下:如果正在卸载软件包,则测试的文件在 %postun 阶段不再存在。我们希望删除 update-alternatives 条目。
但是,如果正在升级软件包,则该文件仍然存在,在这种情况下,我们不希望删除该条目,因为安装已经在 %post 中完成。
我们过去将检查写为 if [ $1 -eq 0 ],使用 RPM 的 功能来检测升级。但是,当升级的软件包是重命名的版本时,这将执行错误的操作。测试文件是否存在更安全。
在更新期间动态更改文件的情况下,应将动态内容部分保留在优先级中,而不是静态数字
# wrong
update-alternatives --install %{_bindir}/python python %{_bindir}/python-%{py_ver} 20
#right
update-alternatives --install %{_bindir}/python python %{_bindir}/python-%{py_ver} $(echo %{py_ver} | sed 's/\.//g')