2015-11-17 4 views
1

У меня есть специальная версия программного обеспечения для Linux, и я упаковываю файл .jar (предназначенный для обновления существующего программного обеспечения) в rpm, а затем пытаюсь воссоздать символическую ссылку, чтобы указать на последнюю версия фляги. Я попытался использовать %post и %postun, чтобы создать и удалить символическую ссылку (если она уже существует), однако это не сработает. Я видел несколько сообщений в Интернете, но они не работали.Создать символическую ссылку в RPM

Как обходной путь, я попытался создать символическую ссылку в марионетке. Для этого я использовал что-то вроде ниже:

if $version == ‘1.1' { 
    file { '/usr/share/prog/software.jar': 
    ensure => 'symlink', 
    target => '/usr/share/prog/java/software-1.1-bin.jar', 
} 

Но даже здесь, в новой версии банка становится создана, но не симлинк.

Пожалуйста, дайте мне знать, если кто-либо решил эту проблему раньше.

Ниже файл спецификации, который я использовал:

%define base_install_dir %{_datadir}/prog 

Name:cdplayer 
Version:1.1 
Epoch:1 
Release:2el6 
Source:cdplayer-1.1-bin.jar 
BuildArch:noarch 
%description  
%prep 
%install 
%{__mkdir} -p %{buildroot}%{base_install_dir} 
%{__install} -D -m 755 %{SOURCE0} %{buildroot}%{base_install_dir} 

%post 
ln -s -f /usr/share/prog/cdplayer-1.1-bin.jar /usr/share/prog/cdplayer.jar 
%postun 
%{__rm} -f /usr/share/prog/cdplayer.jar 
%files 
%defattr(-,root,root,-) 
%dir %{base_install_dir} 
%{base_install_dir}/* 

%changelog 
+0

RPM является более гибким в этом отношении, чем кукольный. Если вы покажете spec-файл, который вы использовали, кто-то может предложить совет. –

+0

Я добавил упрощенную версию спецификации – Arani

+0

Просто прочитав ее, '/ usr/share/prog' не соответствует'% {base_install_dir} '(она находится за пределами этого дерева каталогов). –

ответ

4

Данная спецификация-файл устанавливает cdplayer-1.1-bin.jar, но ссылки на cdplayer-1.1.jar. Вот разница, показывающие изменения, которые я сделал, чтобы заставить его работать как положено:

--- foo.spec.orig 2015-11-16 20:34:48.000000000 -0500 
+++ foo.spec  2015-11-16 20:44:08.017874483 -0500 
@@ -1,21 +1,25 @@ 
%define base_install_dir %{_datadir}/prog 

+Summary: sample rpm spec-file 
+License: unknown 
Name:cdplayer 
Version:1.1 
Epoch:1 
Release:2el6 
-Source:cdplayer-1.1-bin.jar 
+Source:%{name}-%{version}-bin.jar 
BuildArch:noarch 
+%global actual %{name}-%{version}.jar 
+%global linked %{name}.jar 
%description  
%prep 
%install 
%{__mkdir} -p %{buildroot}%{base_install_dir} 
-%{__install} -D -m 755 %{SOURCE0} %{buildroot}%{base_install_dir} 
+%{__install} -D -m 755 %{SOURCE0} %{buildroot}%{base_install_dir}/%{actual} 

%post 
-ln -s -f /usr/share/prog/cdplayer-1.1.jar /usr/share/prog/cdplayer.jar 
+ln -s -f %{base_install_dir}/%{actual} %{base_install_dir}/%{linked} 
%postun 
-%{__rm} -f /usr/share/prog/cdplayer.jar 
+%{__rm} -f %{base_install_dir}/%{linked} 
%files 
%defattr(-,root,root,-) 
%dir %{base_install_dir} 

Есть несколько проблемных областей в спецификации-файл для изучения:

  • есть недостаток в том, обновления, которые будут отображаться, если вы использовали yum (например, Own RPM package: Make symlink survive update/freshen, который проверяет состояние перед удалением ссылки в качестве побочного эффекта обновления пакета по сравнению с удалением).
  • вы используете тег epoch, который требует ухода, но вопрос не дает никаких указаний о шагах, которые вы используете для его обновления.
  • Если вы устанавливаете пакет напрямую, например, просто изменяя значение epoch, вы можете получить несколько копий одного и того же пакета.

Добавление -v опции к командам rm и ln бы показать вам более ясно, что делает пакет, когда вы установите его.

+0

Это не актуальная проблема. Это было учтено в моем коде и по-прежнему не создает ссылку. – Arani

+0

Затем в вашем примере что-то отличается от фактического - я сделал тестовую установку, и мой модифицированный spec-файл работал, как ожидалось. –

2

Вы не должны создавать символическую ссылку в% post. Одна из многих причин заключается в том, что эта символическая ссылка тогда не принадлежит пакету rpm. Если символическая ссылка принадлежит пакету rpm, то rpm обрабатывает ее удаление во время самого обновления.

Пожалуйста, см: https://stackoverflow.com/a/32073947/3489429

Смежные вопросы