Jika Anda menggunakan Red Hat Enterprise Linux (RHEL) atau Fedora, Anda akan segera menggunakan dnf
(atau yum
) untuk menginstal paket perangkat lunak. Red Hat Package Manager (RPM) adalah alat manajemen perangkat lunak yang paling penting pada distribusi Linux ini. Artikel ini menunjukkan bagaimana Anda dapat memanfaatkan kerangka kerja ini untuk mendistribusikan aplikasi Anda sendiri.
Mudah-mudahan, Anda memiliki kesempatan untuk membaca artikel Valentin Bajrami tentang topik yang sama. Saya akan mengulangi beberapa konsep yang sama di sini dan mengilustrasikan beberapa masalah yang mungkin Anda temukan di sepanjang jalan. Saya juga akan menggunakan dua contoh yang lebih kompleks dan mengidentifikasi beberapa masalah yang mungkin Anda temukan saat mengemas aplikasi asli.
Artikel ini menunjukkan cara menentukan cara mengompilasi dan mengemas aplikasi asli Anda sendiri untuk distribusi. Dalam artikel lanjutan, saya akan menjelaskan cara mengemas aplikasi pihak ketiga yang tidak memiliki paket RPM, atau jika ada, Anda ingin menyesuaikannya.
Prasyarat meliputi:
- Anda memiliki pengetahuan dasar tentang cara menggunakan RPM untuk menanyakan paket dan menginstal atau menghapus paket. Jika belum, kenali dulu konsep-konsep ini, lalu kembali ke sini untuk bersenang-senang.
- Anda telah menginstal Make, Git, GCC, dan Java, karena Anda memerlukannya untuk menyelesaikan latihan yang disertakan di sini. Itu tidak wajib, tapi alangkah baiknya jika kamu berlatih saat aku bergerak.
Untuk menginstal Make, GCC, Java 11, dan Git menggunakan pengelola paket DNF, jalankan:
$ sudo dnf install \
make gcc-10 java-11-openjdk-headless git
Kemas perangkat lunak Anda sendiri menggunakan RPM
Artikel ini menggunakan proyek open source kecil yang disebut jdumpertools untuk langkah ini.
Di terminal Linux Anda, klon jdumpertools
dan kemudian kompilasi (Anda telah menginstal Make dan compiler GCC, kan?):
$ git clone [email protected]:josevnz/jdumpertools.git
$ cd jdumpertools
$ make all
$ ls -l jdu jutmp *.so
-rwxrwxr-x 1 josevnz josevnz 32728 Oct 3 16:40 jdu
-rwxrwxr-x 1 josevnz josevnz 32752 Oct 3 16:40 jutmp
-rwxrwxr-x 1 josevnz josevnz 29024 Oct 3 16:40 libjdumpertools.so
Kemudian Anda dapat menjalankan salah satu program yang dihasilkan. Misalnya, coba jdu
(versi sederhana dari du
perintah yang mencetak hasil dalam format JSON):
$ LD_LIBRARY_PATH=$PWD $PWD/jdu /
[{"partition": "/", "free_space": 462140129280.000000, "total_space": 510405902336.000000}]
Sejauh ini, sangat baik.
File jdumpertools.spec di direktori ini adalah file spesifikasi RPM yang mengontrol cara mengompilasi dan mengemas jdumpertools
menggunakan RPM.
Selanjutnya, instal beberapa alat pendukung sebelum pindah ke pembuatan file RPM.
Instal blok penyusun RPM
Dapatkan rpmdevtools
yang diperlukan utilitas dengan menjalankan:
$ sudo dnf install rpm-build rpmdevtools
Kemudian siapkan kotak pasir untuk membuat RPM menggunakan rpmdevtools
. Jangan pernah menggunakan root untuk langkah ini melainkan akun Linux pribadi atau pengembang Anda (ini akan melewati -d
tanda debug):
$ rpmdev-setuptree -d
josevnz /home/josevnz /home/josevnz/.rpmmacros
/home/josevnz/rpmbuild/RPMS /home/josevnz/rpmbuild/SOURCES /home/josevnz/rpmbuild/SPECS
/home/josevnz/rpmbuild/SRPMS /home/josevnz/rpmbuild/BUILD
Ini tampilan yang lebih bagus:
$ tree ~/rpmbuild
/home/josevnz/rpmbuild
├── BUILD
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS
5 directories, 0 files
Saat ini, Anda hanya perlu memperhatikan dua direktori:SOURCES
dan SPECS
. Saya akan menjelaskan yang lain nanti.
Ada juga file baru bernama ~/.rpmmacros
. Anda dapat meletakkan atau mengganti beberapa makro khusus di sana untuk menghindari tugas yang berulang saat membangun paket RPM. File ini penting karena menambatkan rpmbuild
lingkungan dengan direktori home Anda.
Kemas aplikasi Anda
Pertama, buat tar
file kode sumber di ~/rpmbuild/SOURCES
direktori:
VERSION=v0.1
NAME=jdumpertools
TARFILE=$(NAME)-$(VERSION).tar.gz
/usr/bin/tar --exclude-vcs --directory ../ --create --verbose --gzip --file $(HOME)/rpmbuild/SOURCES/$(TARFILE) $(NAME)
Biasanya tar
file berisi skrip dan kode sumber yang akan Anda kompilasi dalam proses pengemasan.
Selanjutnya, buat RPM spec
mengajukan. Sekali lagi, rpmdevtools
memberikan permulaan, seperti ini:
$ rpmdev-newspec ~/rpmbuild/jose-package.spec
/home/josevnz/rpmbuild/jose-package.spec created; type minimal, rpm version >= 4.16.
$ cat ~/rpmbuild/jose-package.spec
Name: jose-package
Version:
Release: 1%{?dist}
Summary:
License:
URL:
Source0:
BuildRequires:
Requires:
%description
%prep
%autosetup
%build
%configure
%make_build
%install
rm -rf $RPM_BUILD_ROOT
%make_install
%files
%license add-license-file-here
%doc add-docs-here
%changelog
* Sun Oct 03 2021 Jose Vicente Nunez <[email protected]>
-
Jangan khawatir jika Anda tidak dapat memahami file ini sekarang. Salin jdumpertools.spec
file ke ~/rpmbuild/SPECS
direktori:
$ cp -pv jdumpertools.spec ~/rpmbuild/SPECS
Dan buat sumber dan file RPM biner:
$ rpmbuild -ba rpmbuild/SPECS/jdumpertools.spec
setting SOURCE_DATE_EPOCH=1609718400
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.kBlIwO
+ umask 022
+ cd /home/josevnz/rpmbuild/BUILD
+ cd /home/josevnz/rpmbuild/BUILD
+ rm -rf jdumpertools
+ /usr/bin/gzip -dc /home/josevnz/rpmbuild/SOURCES/jdumpertools-v0.1.tar.gz
+ /usr/bin/tar -xof -
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd jdumpertools
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ RPM_EC=0
[...]
Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/josevnz/rpmbuild/BUILDROOT/jdumpertools-v0.1-1.fc33.x86_64
Wrote: /home/josevnz/rpmbuild/SRPMS/jdumpertools-v0.1-1.fc33.src.rpm
Wrote: /home/josevnz/rpmbuild/RPMS/x86_64/jdumpertools-v0.1-1.fc33.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.uEyCyL
+ umask 022
+ cd /home/josevnz/rpmbuild/BUILD
+ cd jdumpertools
+ rm -rf /home/josevnz/rpmbuild/BUILDROOT/jdumpertools-v0.1-1.fc33.x86_64
+ RPM_EC=0
++ jobs -p
+ exit 0
Hasil akhirnya adalah dua file:RPM sumber dan RPM biner.
Wrote: /home/josevnz/rpmbuild/SRPMS/jdumpertools-v0.1-1.fc33.src.rpm
Wrote: /home/josevnz/rpmbuild/RPMS/x86_64/jdumpertools-v0.1-1.fc33.x86_64.rpm
Apa yang terjadi selama pemasangan RPM
Jadi apa yang terjadi ketika Anda menginstal setiap RPM khusus Anda?
- Menginstal RPM sumber akan membuat
tar
file danspec
file dirpmbuild
direktori. Ini memungkinkan Anda untuk mengkompilasi ulang aplikasi, membuat perbaikan padaspec
RPM file, dll.$ ls rpmbuild/{SPECS,SOURCES} rpmbuild/SOURCES: jdumpertools-v0.1.tar.gz rpmbuild/SPECS: jdumpertools.spec
- Jika Anda menginstal RPM biner, maka Anda sebenarnya menginstal aplikasi:
$ sudo rpm -ihv ~/rpmbuild/RPMS/x86_64/jdumpertools-v0.1-1.fc33.x86_64.rpm Verifying... ################ [100%] Preparing... ################ [100%] Updating / installing... 1:jdumpertools-v0.1-1.fc33 ################ [100%]
- Konfirmasi bahwa paket yang diinstal ada:
$ rpm -qi jdumpertools Name : jdumpertools Version : v0.1 Release : 1.fc33 Architecture: x86_64 Install Date: Sun 03 Oct 2021 06:32:50 PM EDT Group : Unspecified Size : 95002 License : Apache License 2.0 Signature : (none) Source RPM : jdumpertools-v0.1-1.fc33.src.rpm Build Date : Sun 03 Oct 2021 06:27:11 PM EDT Build Host : dmaf5.home URL : https://github.com/josevnz/jdumpertools Summary : Programs that can be used to dump Linux usage data in JSON format. Description : Jdumpertools is a collection of programs used to dump Linux usage data in JSON format to be ingested by other tools. * jdu: Similar to UNIX 'du' command. * jutmp: UTMP database dumper
Catatan :Pembaca yang penasaran mungkin membuka Makefile
dan melihat target yang disebut rpm
:
rpm: all
test -x /usr/bin/rpmdev-setuptree && /usr/bin/rpmdev-setuptree|| /bin/mkdir -p -v ${HOME}/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
/usr/bin/tar --exclude-vcs --directory ../ --create --verbose --gzip --file $(HOME)/rpmbuild/SOURCES/$(TARFILE) $(NAME)
/usr/bin/rpmbuild -ba jdumpertools.spec
Ini adalah jalan pintas yang nyaman untuk menyiapkan rpmbuild
kotak pasir, tar
file setelah dikompilasi dengan make
, dan mengemasnya menggunakan rpmbuild
memerintah. Jangan ragu untuk menghubungi make rpm
dan lihat apa yang terjadi.
[ Dapatkan kiat lainnya dengan mengunduh lembar contekan skrip shell Bash. ]
Saya menunjukkan kepada Anda perintah dan alat yang digunakan untuk menghasilkan file RPM, tetapi sekarang saatnya untuk menulis spec
RPM berkas.
Buat file spesifikasi untuk alat jdumper
Bekerja dengan file spesifikasi memerlukan pengisian beberapa tag metadata serta menjelaskan bagaimana Anda akan mengompilasi atau mengemas aplikasi. Jdumpertools
adalah aplikasi ANSI C sederhana, jadi buka paket sumber, kompilasi, salin ke area perantara (~/rpmbuild/BUILDROOT
), lalu mengemasnya untuk didistribusikan.
Pertama, lihat file spesifikasi RPM:
Name: jdumpertools
# TODO: Figure out a better way to update version here and on Makefile
Version: v0.1
Release: 1%{?dist}
Summary: Programs that can be used to dump Linux usage data in JSON format.
License: Apache License 2.0
URL: https://github.com/josevnz/jdumpertools
Source0: %{name}-%{version}.tar.gz
BuildRequires: bash,tar,gzip,rpmdevtools,rpmlint,make,gcc >= 10.2.1
Requires: bash
%global debug_package %{nil}
%description
Jdumpertools is a collection of programs you can use to dump Linux usage data in JSON format to be ingested by other tools.
* jdu: Similar to UNIX 'du' command.
* jutmp: UTMP database dumper
%prep
%setup -q -n jdumpertools
%build
make all
%install
rm -rf %{buildroot}
/usr/bin/mkdir -p %{buildroot}/%{_bindir}
/usr/bin/cp -v -p jdu jutmp %{buildroot}/%{_bindir}
/usr/bin/mkdir -p %{buildroot}/%{_libdir}
/usr/bin/cp -v -p libjdumpertools.so %{buildroot}/%{_libdir}
%clean
rm -rf %{buildroot}
%files
%{_bindir}/jdu
%{_bindir}/jutmp
%{_libdir}/libjdumpertools.so
%license LICENSE
%doc README.md
%changelog
* Mon Jan 4 2021 Jose Vicente Nunez <[email protected]> - 0.1
- First version being packaged
Tinjau apa yang penting di sini:
- Metadata, termasuk versi, nama, dan Sumber0; Anda dapat menggunakan variabel atau makro
- Buka paket sumber di
%prep
bagian menggunakan%setup
makro (panduan RPM memiliki banyak detail tentang flag) - Membangun Membutuhkan :Anda harus mencantumkan dependensi yang Anda butuhkan untuk membangun paket. Ini tidak dapat dideteksi secara dinamis.
- %build bagian:Kompilasi dengan
make
- %instal bagian:Salin apa yang Anda perlukan agar program berfungsi (program, perpustakaan, dll.)
- %file bagian:Di mana Anda dapat menentukan apakah file adalah dokumen (%doc ), file lisensi (% lisensi ), atau file biasa
Juga penting:
- Saya menonaktifkan pembuatan kode debug selama pengemasan dengan
%global debug_package %{nil}
. changelog
mendokumentasikan apa yang berubah dengan versi paket baru ini.
Periksa kesalahan dalam file spesifikasi dengan rpmlint
Anda tidak ingin mengetahui dengan susah payah bahwa RPM Anda tidak sempurna. Oleh karena itu, ada baiknya untuk memeriksa kesalahan yang jelas atau cara untuk meningkatkan RPM Anda:
$ sudo dnf install rpmlint
Sekarang periksa spec
RPM berkas:
$ rpmlint /home/josevnz/rpmbuild/SPECS/jdumpertools.spec
/home/josevnz/rpmbuild/SPECS/jdumpertools.spec: W: invalid-url Source0: jdumpertools-v0.1.tar.gz
0 packages and 1 specfiles checked; 0 errors, 1 warnings.
Dokumentasi rpmlint mengatakan bahwa Sumber0 harus berupa URL yang terdefinisi dengan baik (nilainya harus berupa URL HTTP, HTTPS, atau FTP publik yang valid). Jangan khawatir tentang peringatan ini.
Bagaimana dengan RPM itu sendiri?
$ make rpm
...
$ rpmlint --info ~/rpmbuild/RPMS/x86_64/jdumpertools-v0.2-1.fc33.x86_64.rpm
jdumpertools.x86_64: W: summary-ended-with-dot C Programs that can be used to dump Linux usage data in JSON format.
jdumpertools.x86_64: W: spelling-error %description -l en_US du -> dew, doe, Du
jdumpertools.x86_64: E: description-line-too-long C Jdumpertools is a collection of programs that can be used to dump linux usage data in JSON format, so it can be ingested by other tools.
jdumpertools.x86_64: W: incoherent-version-in-changelog 0.1 ['v0.1-1.fc33', 'v0.1-1']
jdumpertools.x86_64: W: invalid-license Apache License 2.0
jdumpertools.x86_64: W: unstripped-binary-or-object /usr/bin/jdu
jdumpertools.x86_64: W: unstripped-binary-or-object /usr/bin/jutmp
jdumpertools.x86_64: W: unstripped-binary-or-object /usr/lib64/libjdumpertools.so
jdumpertools.x86_64: W: no-soname /usr/lib64/libjdumpertools.so
jdumpertools.x86_64: W: no-manual-page-for-binary jdu
jdumpertools.x86_64: W: no-manual-page-for-binary jutmp
1 packages and 0 specfiles checked; 1 errors, 10 warnings.
Sepuluh peringatan dan satu kesalahan. Beberapa mudah diperbaiki:
- Lisensi harus dalam format tertentu
- Halaman manual diperlukan untuk program, jadi saya menulis yang sangat sederhana dengan troff
- Sertakan soname di perpustakaan
Setelah perbaikan, hanya satu peringatan yang tersisa:
$ make rpm
...
$ rpmlint --info ~/rpmbuild/RPMS/x86_64/jdumpertools-v0.2-1.fc33.x86_64.rpm
jdumpertools.x86_64: W: spelling-error %description -l en_US du -> dew, doe, Du
The value of this tag appears to be misspelled. Please double-check.
Peringatan ini mengingatkan Anda bahwa kata du
tampaknya salah eja. Namun, ini hanya referensi ke perintah yang valid, jadi Anda dapat mengabaikan peringatan tersebut.
Sekarang tingkatkan RPM dengan versi yang ditingkatkan:
$ sudo rpm -Uhv ~/rpmbuild/RPMS/x86_64/jdumpertools-v0.2-1.fc33.x86_64.rpm
Saya menggunakan rpm
perintah untuk membuatnya lebih jelas bahwa saya telah memutakhirkan paket dari versi disk lokal alih-alih versi baru dari repositori. Jika mau, Anda dapat melakukan hal yang sama dengan dnf
:
$ sudo dnf install --upgrade \
~/rpmbuild/RPMS/x86_64/jdumpertools-v0.2-1.fc33.x86_64.rpm
Apa yang Anda pelajari, dan apa yang selanjutnya
Perangkat lunak pengemasan dengan RPM terlihat menakutkan pada awalnya, tetapi dengan sedikit kesabaran, Anda akan sampai di sana dalam waktu singkat. Saat Anda mengalami masalah, Anda juga akan menemukan cara yang tepat untuk meningkatkan kode Anda. Berikut adalah beberapa sumber dan rekomendasi akhir:
- Tolong bantu diri Anda sendiri dan dapatkan salinan Panduan Pengemasan RPM yang ditulis oleh Adam Miller, Maxim Svistunov, dan Marie Doleželová. Ini sangat lengkap dan terorganisir dengan baik. Serius, lakukan sekarang; itu bagus.
- Panduan Pengemasan RPM resmi dan panduan RPM Fedora juga lengkap dengan detailnya; jauhkan mereka dari bookmark.
- Gunakan rpmlint. Anda akan terkejut betapa banyak hal kecil yang dapat Anda tangkap dan perbaiki sebelum mengirimkan paket RPM Anda.
- Tidak cukup? Fedora memiliki daftar trik yang dapat Anda gunakan saat mengemas perangkat lunak.
- Masih penasaran? Anda pasti harus melihat pedoman Pengemasan RPM.