ขั้นต่ำที่ฉันต้องทำเพื่อสร้างไฟล์ RPM คืออะไร?


148

ฉันแค่ต้องการสร้างไฟล์ RPM เพื่อแจกจ่ายลินุกซ์ "foobar" ไบนารี่ของฉันโดยมีการพึ่งพาเพียงไม่กี่ตัว มีไฟล์กำหนดค่า /etc/foobar.conf และควรติดตั้งใน / usr / bin / foobar

น่าเสียดายที่เอกสารสำหรับ RPMมีความยาว 27 บทและฉันไม่มีวันนั่งอ่านเพราะฉันยุ่งอยู่กับการติดตั้ง. deb และ EXE สำหรับแพลตฟอร์มอื่น ๆ

ขั้นต่ำที่ฉันต้องทำคืออะไรเพื่อสร้าง RPM สมมติว่า foobar binary และ foobar.conf อยู่ในไดเรกทอรีการทำงานปัจจุบัน


1
" วิธีการสร้างแพคเกจ RPM " เป็นดีเขียนขึ้นในรอบต่อนาที (Fedora เอกสาร)
webwesen

6
การเรียกมันว่า 'การเขียน' คือการพูดน้อย
kernelK

คำตอบ:


177

ฉันมักจะทำไบนารีรอบต่อนาทีต่อแอพที่เป็นกรรมสิทธิ์ของบรรจุภัณฑ์ - เช่นเดียวกับ moster เป็น websphere - บน linux ดังนั้นประสบการณ์ของฉันอาจเป็นประโยชน์กับคุณได้นอกจากนั้นควรทำ TRPM RPM ที่ดีกว่าถ้าทำได้ แต่ฉันเชือนแช

ดังนั้นขั้นตอนพื้นฐานสำหรับการบรรจุโปรแกรม (ไบนารี) ของคุณจึงเป็นดังต่อไปนี้ - ซึ่งฉันคิดว่าโปรแกรมนั้นคือ toybinprog กับรุ่น 1.0, มี conf ที่จะติดตั้งใน /etc/toybinprog/toybinprog.conf และมี bin ที่จะติดตั้ง ใน / usr / bin ชื่อ tobinprog:

1. สร้าง rpm build env สำหรับ RPM <4.6,4.7

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

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

cd ~/rpmbuild

2. สร้าง tarball ของโครงการของคุณ

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. คัดลอกไปยังแหล่งที่มา

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. สร้างแหล่งที่มาและไบนารีรอบต่อนาที

rpmbuild -ba SPECS/toybinprog.spec

และนั่นคือทั้งหมดที่

หวังว่าความช่วยเหลือนี้


6
ในกรณีที่คุณพบ "rpmbuild: คำสั่งไม่พบ" ดูwiki.centos.org/HowTos/SetupRpmBuildEnvironment แต่คู่มือนี้เป็นการเริ่มต้นที่ดีสำหรับฉันในการเรียนรู้ผลงานภายในของรอบต่อนาที
icasimpan

4
ในตัวอย่างของคุณชุด _bindir คืออะไร ฉันพยายามที่จะทำตามวิธีการแก้ปัญหาของคุณ แต่ฉันต้องการที่จะนำไบนารีของฉันไปที่ / เลือก ฉันสร้างไฟล์ Targz ตามนั้น และ rpmbuild ล้มเหลวใน "file not found" ใน buildroot / usr / bin
Kiss Viktoria

sudo dnf install rpm-build- คำสั่ง Fedora 23 สำหรับการติดตั้ง rpmbuild v4.13 +
Ray Foss

1
@ devzero2000 คุณหมายถึงอะไรโดย TRUE RPM?
RubenLaguna

@ devzero2000 โฟลเดอร์ rpmbuild ควรอยู่ที่ / ไดเรกทอรีรากหรือฉันสามารถวางไว้ที่อื่นได้หรือไม่
Diogo Calazans

20

ในฐานะที่เป็นผู้จัดจำหน่ายโปรแกรมFPM เสียงที่สมบูรณ์แบบสำหรับความต้องการของคุณ มีตัวอย่างที่นี่ซึ่งแสดงวิธีการจัดแพคเกจแอปจากแหล่งที่มา FPM สามารถสร้างทั้งไฟล์ deb และไฟล์ RPM


2
FPM เป็นเครื่องมือที่ยอดเยี่ยม
Takashi

เราใช้เครื่องมือนี้ตลอดเวลาที่ทำงาน เครื่องมือที่ใช้งานได้จริงมากที่สุดเพื่อให้เหมาะกับความต้องการ
djhaskin987

2
FPM มีหลักการพื้นฐานที่ดีที่สุดที่เราจะได้รับจากซอฟต์แวร์: ถ้ามันไม่ช่วยก็มีข้อผิดพลาด มันเป็นความมุ่งมั่นที่ฉันยึดมั่น
ribamar

16

สำหรับการสร้างรอบต่อนาทีอย่างรวดเร็วตรวจสอบโตโก:

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

โครงการมีคำแนะนำการเริ่มต้นอย่างรวดเร็วและฉันสามารถสร้าง RPM ขั้นพื้นฐานในเวลาน้อยกว่า 3 นาที

ตัวอย่างการใช้ข้อมูลที่ให้ไว้ในคำถามเดิม:

1) สร้างไดเรกทอรีโครงการโดยใช้สคริปต์:

$ togo project create foobar; cd foobar

2) สร้างโครงสร้างไดเรกทอรีที่คุณต้องการภายใต้. / รากและคัดลอกไฟล์ของคุณลงไป:

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

3) ยกเว้นไดเรกทอรีที่เป็นเจ้าของระบบจากการเป็นเจ้าของ RPM ของคุณ:

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

4) (ทางเลือก) ปรับเปลี่ยนข้อมูลจำเพาะที่สร้างขึ้นเพื่อเปลี่ยนรายละเอียดแพ็คเกจ / การอ้างอิง / เวอร์ชัน / ของคุณ ฯลฯ :

$ vi spec/header

5) สร้าง RPM:

$ togo build package

- และ RPM ของคุณจะคายออกมาในไดเรกทอรี. / rpms


อัปเดตตัวอย่างเพื่อให้ตรงกับสถานการณ์ที่ให้ไว้ในคำถามเดิม
dadealeus

15

ฉันต้องการสร้างรอบต่อนาทีด้วยไฟล์เพียงไม่กี่ไฟล์ เนื่องจากไฟล์เหล่านี้มีการควบคุมแหล่งที่มาและเนื่องจากมันดูโง่ฉันจึงไม่ต้องการให้พวกเขาทำการทดลองเพื่อให้ได้ความเร็วรอบต่อนาทีจนกว่าจะหมด ฉันมากับสิ่งต่อไปนี้:

  1. ตั้งค่าสภาพแวดล้อมของคุณ:

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

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

  2. สร้างไฟล์ข้อกำหนดของคุณ foobar.spec ด้วยเนื้อหาต่อไปนี้:

    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. สร้างรอบต่อนาทีของคุณ: rpmbuild -bb foobar.spec

มีแฮ็คเล็ก ๆ น้อย ๆ ที่มีการระบุ 'แหล่งที่มา' เป็นไดเรกทอรีปัจจุบันของคุณ แต่มันก็ดูดีกว่าทางเลือกอื่นซึ่งในกรณีของฉันเขียนสคริปต์แยกต่างหากเพื่อสร้าง tarball ฯลฯ

หมายเหตุ: ในสถานการณ์เฉพาะของฉันไฟล์ของฉันถูกจัดเรียงในโฟลเดอร์ตามที่พวกเขาต้องไปเช่นนี้

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

และส่วนการเตรียมการจึงกลายเป็น:

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

ซึ่งสะอาดกว่านิดหน่อย

นอกจากนี้ฉันยังอยู่ในรุ่น RHEL5.6 ด้วยรุ่นรอบต่อนาที 4.4.2.3 ดังนั้นไมล์สะสมของคุณอาจแตกต่างกันไป


ฉันต้องหัน$RPM_BUILD_ROOTมา%{buildroot}ใช้มันเพื่อทำงานกับ "Red Hat Enterprise Linux Server รีลีส 6.9" ของฉัน นอกจากนี้ไฟล์สองไฟล์ที่ติดตั้งต้องอยู่ในไดเรกทอรีปัจจุบันเมื่อฉันรัน rpmbuild ฉันติดตั้งลงในเครื่องอื่นด้วย: sudo rpm -Uvh --nodeps foobar-0.1a-1.x86_64.rpm
user1683793

4

หากmake configผลงานสำหรับโปรแกรมของคุณหรือคุณมีสคริปต์เปลือกซึ่งสำเนาแฟ้มที่สองของคุณไปยังสถานที่ที่เหมาะสมที่คุณสามารถใช้checkinstall เพียงไปที่ไดเรกทอรีที่ makefile ของคุณอยู่และเรียกมันด้วยพารามิเตอร์-R(สำหรับRPM ) และเลือกที่จะติดตั้งสคริปต์


4

วิธีง่ายๆในการสร้างแพ็คเกจ rpm จากไบนารี่ (ขั้นตอนเหล่านี้ทดสอบกับ Fedora 18):

1) ก่อนอื่นคุณต้องติดตั้ง rpmdevtools ดังนั้นให้รันคำสั่งเหล่านี้ (ให้ความสนใจ: รันในฐานะผู้ใช้ปกติ)

$ sudo yum install rpmdevtools rpmlint
$ rpmdev-setuptree

2) ในโฟลเดอร์ ~ / rpmbuild / SPECS ให้สร้างไฟล์ใหม่: package_name.spec

3) เปิดด้วยเครื่องมือแก้ไข (เช่น gedit) และเขียนสิ่งนี้:

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 และสร้างเส้นทางที่จะวางไฟล์ดังนั้นในกรณีนี้เช่นสร้าง:

  • ~ / rpmbuild / BUILDROOT / package_name รุ่น-release.i386 / usr / bin /
  • ~ / rpmbuild / BUILDROOT / package_name รุ่น-release.i386 / usr / share / การใช้งาน /
  • ~ / rpmbuild / BUILDROOT / package_name รุ่น-release.i386 / usr / share / pixmaps /

5) ใส่ไฟล์ต่าง ๆ ที่คุณต้องการใส่ลงในโฟลเดอร์เหล่านี้:

  • ~ / rpmbuild / BUILDROOT / package_name รุ่น-release.i386 / usr / bin / binary_file.bin
  • ~ / rpmbuild / BUILDROOT / package_name รุ่น-release.i386 / usr / share / การใช้งาน / package_name.desktop
  • ~ / rpmbuild / BUILDROOT / package_name รุ่น-release.i386 / usr / share / pixmaps / package_name.png

usr / share / pixmaps / package_name.png เป็นไอคอนของไบนารี usr / share / applications / package_name.desktop เป็นกฎในการแทรกโปรแกรมในรายการเมนู

6) package_name.desktop ต้องเป็นดังนี้:

[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;

หมวดหมู่เหล่านี้คือ: standard.freedesktop.org/menu-spec/latest/apa.html

7) เรียกใช้ $ rpmbuild -bb ~/rpmbuild/SPECS/package_name.spec

8) แพ็คเกจของคุณถูกสร้างไว้ในโฟลเดอร์ ~ / rpmbuild / RPMS

หากคุณติดตั้งแพ็คเกจนี้จะเป็นการติดตั้ง:

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

ขอบคุณ: losurs.org/docs/tips/redhat/binary-rpms

ดูรายละเอียดเพิ่มเติมเกี่ยวกับการสร้างรอบต่อนาทีได้ที่ลิงค์นี้

ซอฟต์แวร์ GUI java เพื่อสร้างรอบต่อนาที: https://sourceforge.net/projects/javarpmbuilder/


-1

หากคุณคุ้นเคยกับ Maven ก็rpm-maven-pluginจะทำให้การสร้าง RPM ง่ายขึ้นคุณต้องเขียนเฉพาะpom.xmlสิ่งที่จะถูกใช้เพื่อสร้าง RPM สภาพแวดล้อมการสร้าง RPM ถูกสร้างขึ้นโดยปลั๊กอิน


-3

กระบวนการสร้าง RPM จากไฟล์ต้นฉบับ:

  1. ดาวน์โหลดไฟล์ต้นฉบับที่มีนามสกุล ..gz
  2. ติดตั้ง rpm-build และ rpmdevtools จาก yum install (โฟลเดอร์ rpmbuild จะถูกสร้างขึ้น ... SPECS, SOURCES, RPMS .. โฟลเดอร์จะถูกสร้างขึ้นภายในโฟลเดอร์ rpmbuild)
  3. คัดลอกซอร์สโค้ด.gzไปยังโฟลเดอร์ SOURCES (rpmbuild / SOURCES)
  4. ถอดลูกบอล tar โดยใช้คำสั่งต่อไปนี้ ไปที่โฟลเดอร์ SOURCES: rpmbuild / SOURCES ที่มีไฟล์ tar อยู่ คำสั่ง: เช่นโฟลเดอร์ tar -xvzf httpd-2.22.tar.gz httpd-2.22 จะถูกสร้างในเส้นทางเดียวกัน
  5. ไปที่โฟลเดอร์ที่แตกข้อมูลแล้วพิมพ์คำสั่งด้านล่าง: ./configure --prefix = / usr / local / apache2 - พร้อมกับ apr --enable-proxy --enable-proxy-balancer - กับ mpm = คนทำงาน - -enable-mods-static = all (.configure อาจแตกต่างกันไปตามแหล่งที่ RPM ต้องสร้าง - ฉันได้ทำเพื่อ apache HTTPD ซึ่งต้องการแพ็คเกจ apr และ apr-util)
  6. เรียกใช้คำสั่งด้านล่างเมื่อกำหนดค่าสำเร็จแล้ว: สร้าง
  7. หลังจากประสบความสำเร็จในการดำเนินการให้ทำการเรียกใช้คำสั่ง: ตรวจสอบการติดตั้งในโฟลเดอร์เดียวกัน (หากคุณไม่มีซอฟต์แวร์ตรวจสอบการติดตั้งโปรดดาวน์โหลดรุ่นล่าสุดจากไซต์) นอกจากนี้ซอฟต์แวร์ตรวจสอบการติดตั้งมีข้อผิดพลาดที่สามารถแก้ไขได้ด้วยวิธีการดังต่อไปนี้ ::::: ค้นหา checkinstallrc แล้วเปลี่ยน TRANSLATE = 1 ถึง TRANSLATE = 0 โดยใช้คำสั่ง vim ตรวจสอบแพ็กเกจที่ยกเว้นด้วย: EXCLUDE = "/ selinux"
  8. checkinstall จะถามตัวเลือก (พิมพ์ R หากคุณต้องการ tp build rpm สำหรับไฟล์ต้นฉบับ)
  9. เสร็จแล้วไฟล์. rpm จะถูกสร้างขึ้นในโฟลเดอร์ RPMS ภายในไฟล์ rpmbuild / RPMS ... ดีที่สุด ....

-4

RPM มักถูกสร้างขึ้นจากแหล่งที่มาไม่ใช่ไบนารี

คุณต้องเขียนไฟล์ข้อมูลจำเพาะที่ครอบคลุมถึงวิธีกำหนดค่าและรวบรวมแอปพลิเคชันของคุณ รวมถึงไฟล์ที่จะรวมใน RPM ของคุณ

จากคู่มือฉบับย่อแสดงให้เห็นว่าสิ่งที่คุณต้องการส่วนใหญ่ครอบคลุมอยู่ในบทที่ 8 - เช่นเดียวกับการกระจายตาม RPM ส่วนใหญ่มีแหล่งข้อมูลที่พร้อมใช้งาน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.