2014-05-15 5 views
1
#define program installation destination 
%define app_destination /opt 
%define app_name MY_APP_NAME 
%define app_version 2.1 
%define app_release 7%{?dist} 
%define app_dir %{app_name}-%{app_version} 
%define compress_file %{app_dir}.tar.gz 
%define app_service_softlink /etc/init.d/%{app_name} 
%define app_dir_softlink %{app_destination}/%{app_name} 


Name: %{app_name} 
Version: %{app_version} 
Release: %{app_release} 
Summary: MY APP ONE-SENTENCE SUMMARY %{app_version} 

# An open source software license 
License: GPLv3+ 
URL: http://www.starscriber.com/ 
Source0: http://ftp.gnu.org/gnu/%{compress_file} 


%description 
MY APP DESCRIPTION 

%pre 
#each time before install/upgrade RPM, check and remove the softlinks provided below 
echo "pre..." 

if [ -L %{app_service_softlink} ];then 
    rm %{app_service_softlink} 
elif [ -f %{app_service_softlink} ];then 
    rm %{app_service_softlink} 
fi 

if [ -L %{app_dir_softlink} ]; then 
    rm %{app_dir_softlink} 
elif [ -d %{app_dir_softlink} ]; then 
    rmdir %{app_dir_softlink} 
fi 



%prep 
%setup -q 
echo "prep..." 

# Script commands to "build" the program (e.g. to compile it) and 
# get it ready for installing. The program should come with 
# instructions on how to do this. 
%build 


%install 
echo "install..." 
# uses relative paths 
# creates buildroot/destination directory 
mkdir -p %{buildroot}%{app_destination} 

# copies tar.gz file from source directory to buildroot/destination directory 
cp %{_sourcedir}/%{compress_file} %{buildroot}%{app_destination} 

# changes directory to buildroot/destination 
cd %{buildroot}%{app_destination} 

# extracts compression file 
tar xf %{compress_file} 

# removes the compression file 
rm -rf %{compress_file} 

cd %{buildroot}%{app_destination} 


#invoked after %post when RPM pkg is removal or upgrade 
%preun 
echo "preun..." 
#leftover cleanup 


#invoked after %preun when RPM pkg is removal or upgrade 
%postun 
echo "postun..." 
if [ "$1" == "0" ]; then 
    rm -rf %{app_destination}/%{app_dir} 
fi 

if [ ! -d %{app_destination}/%{app_dir} ]; then 
    if [ -L %{app_service_softlink} ]; then 
     rm %{app_service_softlink} 
    elif [ -f %{app_service_softlink} ]; then 
     rm %{app_service_softlink} 
    fi 

    if [ -L %{app_dir_softlink} ]; then 
     rm %{app_dir_softlink} 
    elif [ -d %{app_dir_softlink} ]; then 
     rmdir %{app_dir_softlink} 
    fi 
fi 

%files 
#all files under the provided folder will be gathered up to create RPM pkg 
%{app_destination}/%{app_dir}/bin 
%{app_destination}/%{app_dir}/conf 
%{app_destination}/%{app_dir}/misc 



%post 
echo "post" 
#symbolic link to the new appdir with version 
echo "builds new symbolic link for the app folder" 
ln -sf %{app_destination}/%{app_dir} %{app_dir_softlink} 

echo "builds new symbolic link for the app service" 
# make a symbolic for the service file using the new created softlink 
ln -sf %{app_destination}/%{app_name}/misc/%{app_name} %{app_service_softlink} 

내 자신의 RPM 패키지를 만들려고하는데 여기 SPEC 파일이 있습니다. 설치 (rpm -ivh app-2.1-6.el6.x86_64.rpm)하거나 업그레이드 (rpm -Uvh app -2.1-7.el6.x86_64.rpm) 또는 제거 할 수 (rpm -e 앱 2.1-7.el6.x86_64.rpm)RPM 패키지 (버전 번호가 수정 됨)를 업데이트 (-Uvh) 할 때 이전 버전 응용 프로그램 폴더를 제거하는 방법은 무엇입니까?

For RPM package app-2.1-7.el6.x86_64.rpm, the version is 2.1 and release number is 7. 

내 질문은, 아무리 내가 릴리스 번호를 수정하는 방법, 설치하지/upgrade/remove가 제대로 작동하지만 버전 번호를 2.2 또는 3.2로 수정하면 이전 버전 폴더 (/opt/app-2.1)가 삭제되지 않습니다. 누구든지 나를 도와 줄 수 있습니다. 어떻게 이전 버전 폴더를 삭제해야합니까? (-Uvh) RPM 패키지를 업데이트 할 때 (/opt/app-2.1)?

답변

1

패키지가 디렉토리 /opt/2.1 디렉토리를 "소유"하지 않는 것이 문제입니다.

tar와 마찬가지로 rpm은 경로에 내용을 설치하기 위해 "누락 된"디렉토리 을 생성합니다.

지우기시 rpm은 % files manifest에 명시 적으로 언급 된 인 디렉토리 만 제거합니다.

짧은 대답 : rpm --erase가 % 28 디렉토리 경로를 제거하기를 원한다면, % 파일에 언급 된 .

짧은 답변 : % 파일에 % dir/opt/app - % {version} 을 % 파일에 추가하십시오. 디렉토리가 비어 있으면 (즉,/opt/app - % {version}의 다른 모든 파일 이 "소유"되어 제거 될 수 있음) "소유/opt/app = % {버전}도 제거됩니다 .