Bir RPM dosyası oluşturmak için en az ne yapmam gerekir?


148

Linux ikili "foobar" ımı dağıtmak için sadece birkaç bağımlılıkla bir RPM dosyası oluşturmak istiyorum. /Etc/foobar.conf bir yapılandırma dosyasına sahiptir ve / usr / bin / foobar içine kurulmalıdır.

Ne yazık ki RPM belgeleri 27 bölüm uzunluğunda ve gerçekten oturup bir günüm yok, çünkü aynı zamanda diğer platformlar için .deb ve EXE yükleyicileri yapmakla meşgulüm.

RPM oluşturmak için yapmam gereken minimum minimum değer nedir? Foobar binary ve foobar.conf öğelerinin geçerli çalışma dizininde olduğunu varsayalım.


1
" RPM paketi nasıl oluşturulur " RPM (Fedora dokümanları) hakkında iyi bir
yazıdır

6
Buna "yazma" demek yetersizdir
kernelK

Yanıtlar:


177

Linux üzerinde genellikle websphere olarak da adlandırılan paketleme uygulamaları başına ikili rpm yapıyorum. Bu yüzden tecrübelerim sizin için de yararlı olabilir, ayrıca eğer mümkünse DOĞRU RPM yapmak daha iyi olur. Ama konuya giriyorum.

Yani (ikili) programınızı paketlemek için temel bir adım aşağıdaki gibidir - ki bu programın sürüm 1.0 ile toybinprog olduğunu varsayalım, /etc/toybinprog/toybinprog.conf dosyasına yüklenecek bir konfi var ve kurulacak bir kutu var tobinprog adlı / usr / bin dizininde:

1. RPM <4.6,4.7 için rpm derleme env'nizi oluşturun

mkdir -p ~/rpmbuild/{RPMS,SRPMS,BUILD,SOURCES,SPECS,tmp}

cat <<EOF >~/.rpmmacros
%_topdir   %(echo $HOME)/rpmbuild
%_tmppath  %{_topdir}/tmp
EOF

cd ~/rpmbuild

2. Projenizin tarball'ını oluşturun

mkdir toybinprog-1.0
mkdir -p toybinprog-1.0/usr/bin
mkdir -p toybinprog-1.0/etc/toybinprog
install -m 755 toybinprog toybinprog-1.0/usr/bin
install -m 644 toybinprog.conf toybinprog-1.0/etc/toybinprog/

tar -zcvf toybinprog-1.0.tar.gz toybinprog-1.0/

3. Resources dir dizinine kopyalayın

cp toybinprog-1.0.tar.gz SOURCES/

cat <<EOF > SPECS/toybinprog.spec
# Don't try fancy stuff like debuginfo, which is useless on binary-only
# packages. Don't strip binary too
# Be sure buildpolicy set to do nothing
%define        __spec_install_post %{nil}
%define          debug_package %{nil}
%define        __os_install_post %{_dbpath}/brp-compress

Summary: A very simple toy bin rpm package
Name: toybinprog
Version: 1.0
Release: 1
License: GPL+
Group: Development/Tools
SOURCE0 : %{name}-%{version}.tar.gz
URL: http://toybinprog.company.com/

BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root

%description
%{summary}

%prep
%setup -q

%build
# Empty section.

%install
rm -rf %{buildroot}
mkdir -p  %{buildroot}

# in builddir
cp -a * %{buildroot}


%clean
rm -rf %{buildroot}


%files
%defattr(-,root,root,-)
%config(noreplace) %{_sysconfdir}/%{name}/%{name}.conf
%{_bindir}/*

%changelog
* Thu Apr 24 2009  Elia Pinto <devzero2000@rpm5.org> 1.0-1
- First Build

EOF

4. kaynak ve ikili dev / dak

rpmbuild -ba SPECS/toybinprog.spec

Ve hepsi bu.

Umarım bu yardım


6
"Rpmbuild: command not found" ile karşılaşırsanız, bkz. Wiki.centos.org/HowTos/SetupRpmBuildEnvironment . Ama bu rehber
rpm'nin

4
Örneğinizde _bindir'i ne ayarlar? Çözümünüzü takip etmeye çalışıyorum, ancak ikili dosyalarımı / opt dizinine koymak istiyorum. Targz dosyasını buna göre oluşturdum. Ve rpmbuild buildroot / usr / bin içinde "dosya bulunamadı" da başarısız oluyor.
Viktoria öpücük

sudo dnf install rpm-build- rpmbuild v4.13 + yüklemek için Fedora 23 komutu
Ray Foss

1
@ devzero2000 GERÇEK RPM ile ne demek istiyorsun?
RubenLaguna

@ devzero2000 rpmbuild klasörü / root dizininde olmalı ya da başka bir yere yerleştirmek?
Diogo Calazans

20

Bir uygulama dağıtıcısı olarak, fpm ihtiyaçlarınız için mükemmel bir ses çıkarır . Burada bir uygulamanın kaynaktan nasıl paketleneceğini gösteren bir örnek var . FPM hem deb dosyalarını hem de RPM dosyalarını üretebilir.


2
FPM harika bir araçtır.
Takashi

Bu aracı iş yerinde her zaman kullanıyoruz. İhtiyaca uygun en pratik araç.
djhaskin987

2
FPM, yazılımda alabileceğiniz en iyi temel prensibe sahiptir: eğer yardımcı olmazsa, bir hata vardır. Değer verdiğim bir taahhüt.
ribamar

16

Hızlı RPM oluşturmak için Togo'ya göz atın:

https://github.com/genereese/togo-rpm

Projenin bir Hızlı Başlangıç ​​kılavuzu var ve 3 dakikadan daha kısa bir sürede temel bir RPM oluşturabildim.

Orijinal soruda verilen verileri kullanan örnek:

1) Komut dosyasını kullanarak proje dizinini oluşturun:

$ togo project create foobar; cd foobar

2) ./root altında istediğiniz dizin yapısını oluşturun ve dosyalarınızı buraya kopyalayın:

$ mkdir -p root/etc; cp /path/to/foobar.conf root/etc/
$ mkdir -p root/usr/bin; cp /path/to/foobar root/usr/bin/

3) Sisteme ait dizinleri BGBG'nizin sahipliğinden hariç tutun:

$ togo file exclude root/etc root/usr/bin

4) (İSTEĞE BAĞLI) Paket açıklamanızı / bağımlılıklarınızı / sürümünüzü / istediğinizi vb. Değiştirmek için oluşturulan spesifikasyonu değiştirin.

$ vi spec/header

5) RPM oluşturun:

$ togo build package

-ve RPM'niz ./rpms dizinine gönderilir.


Örneği, orijinal soruda verilen senaryo ile eşleşecek şekilde güncelledi.
dadealeus

15

Benzer şekilde, sadece birkaç dosya ile bir rpm oluşturmak gerekiyordu. Bu dosyalar kaynak kontrollü olduğundan ve aptalca göründüğü için, sadece rpm'nin onları açması için onları tartalamak istemedim. Aşağıdaki ile geldim:

  1. Ortamınızı ayarlayın:

    mkdir -p ~/rpm/{BUILD,RPMS}

    echo '%_topdir %(echo "$HOME")/rpm' > ~/.rpmmacros

  2. Spec dosyanızı (foobar.spec) aşağıdaki içeriklerle oluşturun:

    Summary: Foo to the Bar
    Name: foobar
    Version: 0.1
    Release: 1
    Group: Foo/Bar
    License: FooBarPL
    Source: %{expand:%%(pwd)}
    BuildRoot: %{_topdir}/BUILD/%{name}-%{version}-%{release}
    
    %description
    %{summary}
    
    %prep
    rm -rf $RPM_BUILD_ROOT
    mkdir -p $RPM_BUILD_ROOT/usr/bin
    mkdir -p $RPM_BUILD_ROOT/etc
    cd $RPM_BUILD_ROOT
    cp %{SOURCEURL0}/foobar ./usr/bin/
    cp %{SOURCEURL0}/foobar.conf ./etc/
    
    %clean
    rm -r -f "$RPM_BUILD_ROOT"
    
    %files
    %defattr(644,root,root)
    %config(noreplace) %{_sysconfdir}/foobar.conf
    %defattr(755,root,root)
    %{_bindir}/foobar
    
  3. RPM'nizi oluşturun: rpmbuild -bb foobar.spec

Orada 'dizini' mevcut dizininiz olarak belirten küçük bir hackery var, ama benim durumumda, bir tarball, vb. Oluşturmak için ayrı bir komut dosyası yazmak için olan alternatiften çok daha zarif görünüyordu.

Not: Özel durumumda, dosyalarım gitmeleri gereken yere göre klasörler halinde düzenlenmişti, şöyle:

./etc/foobar.conf
./usr/bin/foobar

ve böylece hazırlık bölümü şöyle oldu:

%prep
rm -rf $RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT
cd $RPM_BUILD_ROOT
tar -cC %{SOURCEURL0} --exclude 'foobar.spec' -f - ./ | tar xf -

Bu biraz daha temiz.

Ayrıca, rpm 4.4.2.3 sürümlerine sahip bir RHEL5.6'da olacağım, böylece kilometreniz değişebilir.


Bütün çevirmek zorunda $RPM_BUILD_ROOTiçin %{buildroot}benim "Red Hat Enterprise Linux Server sürümü 6.9" konulu işe almak için. Ayrıca, rpmbuild'i çalıştırdığımda yüklenen iki dosyanın geçerli dizinde olması gerekiyordu. Diğer sudo rpm -Uvh --nodeps foobar-0.1a-1.x86_64.rpm
makineme

4

Eğer make configprogramınız veya sizin için çalışır hangi kullanabileceğiniz uygun yere kopyalar iki dosya bir kabuk komut dosyası var checkinstall . Sadece makefile dosyanızın bulunduğu dizine gidin ve parametreyle -R( RPM için ) ve isteğe bağlı olarak kurulum betiğiyle çağırın .


4

İkili paketten rpm paketi oluşturmanın kolay yolu (bu adımlar Fedora 18 ile test edildi):

1) Önce rpmdevtools'u yüklemeniz gerekir, bu yüzden bu komutları çalıştırın (dikkat: normal kullanıcı olarak çalıştır)

$ sudo yum install rpmdevtools rpmlint
$ rpmdev-setuptree

2) ~ / rpmbuild / SPECS klasöründe yeni dosya oluşturun: package_name.spec

3) Bir editörle (gedit gibi) açın ve şunu yazın:

Name:           package_name
Version:        1.0
Release:        1
Summary:        Short description (first char has to be uppercase)

License:        GPL
URL:            www. your_website/

BuildRequires:  package_required >= (or ==, or <=) 1.0.3 (for example)

%description
Description with almost 79 characters (first char has to be uppercase)

#This is a comment (just as example)

%files
/usr/bin/binary_file.bin
/usr/share/applications/package_name.desktop
/usr/share/pixmaps/package_name.png

%changelog
* date Packager's Name <packager's_email> version-revision
- Summary of changes

#For more details see: docs.fedoraproject.org/en-US/Fedora_Draft_Documentation/0.1/html/Packagers_Guide/sect-Packagers_Guide-Creating_a_Basic_Spec_File.html

4) ~ / rpmbuild / BUILDROOT / package_name-version-release.i386 yapın ve dosyaların yerleştirileceği yolları yeniden oluşturun. Bu durumda örneğin şunu oluşturun:

  • ~ / Rpmbuild / BUILDROOT / package_name-versiyon-release.i386 / usr / bin /
  • ~ / Rpmbuild / BUILDROOT / package_name-versiyon-release.i386 / usr / share / uygulamalar /
  • ~ / Rpmbuild / BUILDROOT / paket_adi-versiyon-release.i386 / usr / share / pixmaps'i /

5) Bu klasörlere pakete eklemek istediğiniz dosyaları koyun:

  • ~ / Rpmbuild / BUILDROOT / package_name-versiyon-release.i386 / usr / bin / binary_file.bin
  • ~ / Rpmbuild / BUILDROOT / paket_adi-versiyon-release.i386 / usr / share / uygulamalar / package_name.desktop
  • ~ / Rpmbuild / BUILDROOT / package_name-versiyon-release.i386 / usr / share / pixmaps'i / package_name.png

usr / share / pixmaps / package_name.png ikili usr / share / apps / package_name.desktop ikonunu menü girişlerine eklemek için kullanılan kurallardır

6) package_name.desktop şöyle olmalıdır:

[Desktop Entry]
Encoding=UTF-8
Type=Application
Name=example
GenericName=Short description
Comment=Comment of the application
Exec=package_name
Icon=package_name
Terminal=false
Categories=System;

Kategoriler bunlar: standards.freedesktop.org/menu-spec/latest/apa.html

7) Koş $ rpmbuild -bb ~/rpmbuild/SPECS/package_name.spec

8) Paketiniz ~ / rpmbuild / RPMS klasörüne yerleştirildi

Bu paketi yüklerseniz yükleyin:

  • /usr/bin/binary_file.bin
  • /usr/share/applications/package_name.desktop
  • /usr/share/pixmaps/package_name.png

Teşekkürler: losurs.org/docs/tips/redhat/binary-rpms

Devir / dakika oluşturmak için daha fazla ayrıntı için bu bağlantıya göz atın .

Rpm oluşturmak için GUI java yazılımı: https://sourceforge.net/projects/javarpmbuilder/


-1

Maven'e aşina iseniz, ayrıca rpm-maven-pluginRPM'leri yapmayı da basitleştirir: sadece yazmanız gerekir, pom.xmlbu daha sonra RPM oluşturmak için kullanılacaktır. RPM oluşturma ortamı eklenti tarafından dolaylı olarak oluşturulur.


-3

Kaynak dosyadan RPM oluşturma işlemi:

  1. kaynak dosyası ile indirme. gz uzantısı.
  2. yum install'den rpm-build ve rpmdevtools'u kurun. (rpmbuild klasörü oluşturulacaktır ... SPECS, SOURCES, RPMS .. klasörleri rpmbuild klasörü içinde oluşturulmalıdır).
  3. source code.gz dosyasını SOURCES klasörüne kopyalayın. (rpmbuild / SOURCES)
  4. Aşağıdaki komutu kullanarak katran topunun yıldızını açın. tar dosyasının bulunduğu SOURCES klasörüne gidin: rpmbuild / SOURCES. komutu: örn. tar -xvzf httpd-2.22.tar.gz httpd-2.22 klasörü aynı yolda oluşturulur.
  5. ayıklanan klasöre gidin ve ardından aşağıdaki komutu yazın: ./configure --prefix = / usr / local / apache2 --with-include-apr --enable-proxy --enable-proxy-balancer --with-mpm = worker - -enable-mods-static = all (.configure, RPM'nin oluşturulması gereken kaynağa göre değişebilir - apr ve apr-util bağımlılık paketine ihtiyaç duyan apache HTTPD için yaptım).
  6. Yapılandırma başarılı olduğunda aşağıdaki komutu çalıştırın: make
  7. başarılı yürütme sonra komut yapmak run run: aynı klasörde checkinstall. (checkinstall yazılımınız yoksa lütfen siteden en son sürümü indirin) Ayrıca checkinstall yazılımı aşağıdaki yolla çözülebilecek bir hataya sahiptir ::::: checkinstallrc'yi bulun ve vL komutunu kullanarak TRANSLATE = 1 yerine TRANSLATE = 0 olarak değiştirin. Ayrıca hariç tutma paketini kontrol et: EXCLUDE = "/ selinux"
  8. checkinstall seçeneği sorar (kaynak dosya için tp build rpm istiyorsanız R yazın)
  9. Bitti .rpm dosyası rpmbuild / RPMS dosyası içinde RPMS klasöründe inşa edilecek ... TÜM EN İYİ ....

-4

RPM'ler genellikle ikili dosyalardan değil, kaynaktan oluşturulur.

Uygulamanızı nasıl yapılandıracağınızı ve derleyeceğinizi kapsayan spec dosyasını yazmanız gerekir; Ayrıca, RPM'nize hangi dosyaların dahil edileceğini.

Elkitabına hızlı bir bakış, ihtiyacınız olan şeylerin çoğunun Bölüm 8'de ele alındığını göstermektedir - ayrıca, çoğu RPM tabanlı dağıtımın kaynakları olduğundan, tam olarak bakabileceğiniz farklı yaklaşımların bir milyon örneği vardır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.