การสร้างแพ็คเกจเดเบียน HowTo

Debian Package Creation Howto



1. คำนำ

ความรับผิดชอบต่อเครื่องหมายถึงการดูแลฮาร์ดแวร์และส่วนประกอบซอฟต์แวร์ ตามที่เห็นในชีวิตประจำวันในฐานะผู้ดูแลระบบ การติดตั้งซอฟต์แวร์เป็นแพ็คเกจซอฟต์แวร์จะดีกว่ามาก แทนที่จะติดตั้งไฟล์ต้นทางจำนวนมาก ซึ่งจะช่วยลดต้นทุนในการบำรุงรักษาระบบอย่างเหมาะสม

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







รูปแบบแพ็คเกจขึ้นอยู่กับการแจกจ่าย Linux ของคุณ รูปแบบที่เลือกมีดังต่อไปนี้:



deb

แพ็คเกจที่ใช้ใน: เดเบียน GNU/Linux , อูบุนตู , Armbian , Linux Mint , Knoppix



rpm

แพ็คเกจที่ใช้ใน: หมวกสีแดง , Fedora , CentOS , OpenSuse





tgz and txz

แพ็คเกจที่ใช้ใน: สแล็คแวร์

tar.xz

แพ็คเกจที่ใช้ใน: Arch Linux



เอกสารนี้อธิบายวิธีสร้างแพ็คเกจสำหรับ Debian GNU/Linux แบบย่อ สำหรับข้อมูลโดยละเอียดเกี่ยวกับรูปแบบแพ็คเกจ Debian และเครื่องมือในการดูแลระบบ Linux ที่ใช้ `deb` คุณอาจดูใน Debian Package Management Book [dpmb] ในการสร้างแพ็คเกจสำหรับ Debian GNU/Linux เอกสารเหล่านี้มีความจำเป็น:

  • คู่มือการดูแลผู้ใช้ Debian ใหม่ [dnmg]
  • ข้อมูลอ้างอิงของนักพัฒนา Debian [GDR]
  • บทแนะนำเกี่ยวกับบรรจุภัณฑ์เดเบียน [สามารถ]
  • คู่มือนโยบายเดเบียน [รอบต่อนาที]

แพ็คเกจที่เราจะใช้งานนั้นมีชื่อว่า `helloworld' และมีหมายเลขเวอร์ชัน 0.1 เพื่อจุดประสงค์ในการสาธิต มันมีเพียงสคริปต์ Python ตัวเดียวที่แสดงข้อความ Hello, world!:

#!/usr/bin/python print ('Hello, world!') 

2. ข้อกำหนด

2.1. คีย์ GPG

ตามขั้นตอนที่ 1 เตรียมคีย์ GPG ของคุณให้พร้อม ต่อมาจะต้องใช้กุญแจในการเซ็นรับพัสดุ โปรดทราบว่าแพ็คเกจที่ไม่ได้ลงนามนั้นไม่น่าเชื่อถือและไม่สามารถเป็นส่วนหนึ่งของจักรวาล Debian ได้

ในกรณีที่คุณยังไม่มีคีย์ GPG ให้สร้างใหม่ คุณสามารถปฏิบัติตามสามขั้นตอนด้านล่าง คำสั่งแรกสร้างคีย์ใหม่ คำสั่งที่สองส่งออกคีย์ใหม่ของคุณไปยังไฟล์แยกต่างหาก และคำสั่งที่สามเพิ่มคีย์ลงในคีย์ริงส่วนตัวของคุณ

$ gpg --gen-key $ gpg -a --output ~/.gnupg/YOUR_NAME.gpg --export 'YOUR NAME' $ gpg --import ~/.gnupg/YOUR_NAME.gpg 

ในระหว่างการสร้าง ตรวจสอบให้แน่ใจว่าชื่อที่ระบุ _YOUR NAME_ ถูกต้อง เป็นเรื่องปกติที่จะใช้ชื่อและนามสกุลร่วมกัน ชื่อนี้จะต้องเหมือนกันทุกประการในแพ็คเกจ จากนั้นเมื่อสร้างไฟล์ `control` ของแพ็คเกจ Debian สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ GPG โปรดดูที่ GNU Privacy Handbook [gph]

2.2. ห่วงโซ่เครื่องมือบรรจุภัณฑ์

ในการสร้างแพ็คเกจ Debian ด้วยซอร์สโค้ด จำเป็นต้องใช้แพ็คเกจซอฟต์แวร์ต่อไปนี้ในระบบของคุณ:

  • สร้างสำคัญ
  • autoconf
  • automake
  • autotools-dev
  • dh-make
  • debhelper
  • devscripts
  • รากปลอม
  • xutils
  • lintian
  • pbuilder

ในฐานะผู้ใช้ 'รูท' คุณสามารถติดตั้งได้โดยใช้คำสั่งต่อไปนี้:

# apt-get install build-essential autoconf automake autotools-dev dh-make debhelper devscripts fakeroot xutils lintian pbuilder 

2.3. เตรียมซอฟต์แวร์ที่จะบรรจุ

เราต้องเตรียมไดเร็กทอรีเพื่อสร้างแพ็คเกจ สร้างไดเร็กทอรีเพื่อเตรียมสภาพแวดล้อมที่เราจะสร้างแพ็คเกจ:

$ mkdir -p ~./build/helloworld/0.1 

คัดลอกไฟล์บีบอัด 'tar.gz' ในไดเร็กทอรี:

$ cp helloworld-0.1.tar.gz ~./build/helloworld/0.1 

เปลี่ยนเป็นไดเร็กทอรีและแตกแพ็กเกจ:

$ cd ~./build/helloworld/0.1 ~/build/helloworld/0.1$ tar -xzf helloworld-0.1.tar.gz 

ตอนนี้ ไดเร็กทอรีมีทั้งซอร์สโค้ดในไดเร็กทอรีที่แยกจากกัน และไฟล์เก็บถาวรที่บีบอัด:

~/build/helloworld/0.1$ ls helloworld-0.1 helloworld-0.1.tar.gz 

3. Debianization

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

3.1 เตรียมโครงสร้างแพ็คเกจ

เปลี่ยนเป็นไดเร็กทอรีที่เก็บซอร์สโค้ดทั้งหมดของแพ็คเกจ ในตัวอย่างของเรา แพ็คเกจประกอบด้วยไฟล์ `helloworld.py' เท่านั้น:

~$ cd build/helloworld/0.1/helloworld-0.1 ~/build/helloworld/0.1/helloworld-0.1$ ls helloworld.py 

มาเพิ่มไฟล์เฉพาะของแพ็คเกจ Debian กันเถอะ เครื่องมือ `dh_make` เข้ามามีบทบาท สวิตช์ '-e' ใช้ที่อยู่ที่ระบุเป็นที่อยู่อีเมลในช่อง 'ผู้ดูแล' ของไฟล์ 'เดเบียน/ตัวควบคุม' การสร้างแพ็คเกจใช้ที่อยู่อีเมลของคุณเองแทน อย่าลืมใช้ที่อยู่อีเมลเดียวกันกับที่ตรงกับคีย์ GPG ของคุณ

สวิตช์ `-f' ใช้ไฟล์ที่กำหนดเป็นไฟล์เก็บถาวรต้นฉบับ และข้ามการคัดลอกแผนผังโปรแกรมปัจจุบันไปที่ `program.orig'

~/build/helloworld/0.1/helloworld-0.1$ dh_make -e [email protected] -f ../helloworld-0.1.tar.gz 

ที่พร้อมท์ ระบบจะขอให้คุณเลือกประเภทของแพ็คเกจที่ควรสร้าง ในการเลือก _single binary_ พิมพ์ `s`

Type of package: single binary, indep binary, multiple binary, library, kernel module, kernel patch? [s/i/m/l/k/n] s Maintainer name : Frank Hofmann Email-Address : [email protected] Date : Sat, 04 Nov 2017 21:16:13 +0100 Package Name : helloworld Version : 0.1 License : blank Type of Package : Single Hit to confirm: Currently there is no top level Makefile. This may require additional tuning. Done. Please edit the files in the debian/ subdirectory now. You should also check that the helloworld Makefiles install into $DESTDIR and not in / . 

ส่งผลให้ไดเร็กทอรีชื่อ `debian':

~/build/helloworld/0.1/helloworld-0.1$ ls debian helloworld.py 

ไดเร็กทอรีนี้มีไฟล์เฉพาะแพ็คเกจทั้งหมด

3.2. ปรับไฟล์ควบคุม

ไฟล์ `เดเบียน/การควบคุม' เก็บการพึ่งพาที่จำเป็น _to build_ แพ็คเกจ การใช้คำสั่ง `dpkg-depcheck -d ./configure` คุณจะได้รับรายการพร้อมแพ็คเกจที่จำเป็นทั้งหมด ในกรณีของเราไม่จำเป็นต้องมีแพ็คเกจเพิ่มเติมเพราะ Python เป็นภาษาที่ตีความ

ต่อไป เราต้องแก้ไขไฟล์ `debian/control' และเพิ่มค่าเฉพาะแพ็คเกจ สำหรับตัวอย่างของเรามีลักษณะดังนี้:

Source: helloworld Section: python Priority: optional Maintainer: Frank Hofmann < [email protected] > Build-Depends: debhelper (>= 9) Standards-Version: 3.9.5 Homepage: http://www.efho.de/ #Vcs-Git: git://anonscm.debian.org/collab-maint/helloworld.git #Vcs-Browser: http://anonscm.debian.org/?p=collab-maint/helloworld.git;a=summary Package: helloworld Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, python Description: Prints Hello World in Python Prints Hello World in Python 

3.3. ปรับไฟล์ลิขสิทธิ์

ไฟล์ `เดเบียน/ลิขสิทธิ์' มีข้อมูลใบอนุญาตสำหรับแพ็คเกจซอฟต์แวร์ มันถูกเตรียมไว้สำหรับการเปิดตัวผ่าน GNU Public License 2 (GPLv2) สำหรับตัวอย่างของเรามีลักษณะดังนี้:

Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: helloworld Source: http://www.efho.de/ Files: debian/* Copyright: 2017 Frank Hofmann < [email protected] > License: GPL-2+ This package is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. . This package is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. . You should have received a copy of the GNU General Public License along with this program. If not, see . On Debian systems, the complete text of the GNU General Public License version 2 can be found in '/usr/share/common-licenses/GPL-2'. 

3.4. ปรับไฟล์บันทึกการเปลี่ยนแปลง

หลังจากข้อมูลลิขสิทธิ์แล้ว ไฟล์ `debian/changelog' จะต้องได้รับการปรับ ในตัวอย่างของเรา เราเพิ่มข้อมูล การเปิดตัวครั้งแรก

helloworld (0.1-1) unstable; urgency=low * Initial release -- Frank Hofmann < [email protected] > Sat, 04 Nov 2017 21:16:13 +0100 

นั่นคือทั้งหมดที่เราต้องการจนถึงตอนนี้ — ในที่สุดเราก็สร้างแพ็คเกจได้แล้ว


4. สร้างแพ็คเกจ

ในการสร้างแพ็คเกจเราต้องย้ายขึ้นหนึ่งไดเร็กทอรีและรันคำสั่งต่อไปนี้:

~/build/helloworld/0.1/helloworld-0.1$ dpkg-buildpackage -rfakeroot

ตัวเลือก `-rfakeroot' ช่วยให้ `dpkg-buildpackage' สามารถรันคำสั่งในฐานะผู้ใช้ที่ได้รับสิทธิพิเศษด้วยความช่วยเหลือของคำสั่ง `fakeroot' นี่เป็นสิ่งจำเป็นในการเตรียมแพ็คเกจ และสร้างไฟล์และไดเร็กทอรี
คำสั่งด้านบนส่งผลให้รายการข้อความเอาต์พุตยาวขึ้น (แสดงที่นี่ในสภาพแวดล้อมที่เป็นภาษาเยอรมัน):

dpkg-buildpackage: Quellpaket helloworld dpkg-buildpackage: Quellpaket helloworld dpkg-buildpackage: Quellversion 0.1-1 dpkg-buildpackage: Quelldistribution unstable dpkg-buildpackage: Quellen geändert durch Frank Hofmann < [email protected] > dpkg-buildpackage: Host-Architektur amd64 dpkg-source --before-build helloworld-0.1 fakeroot debian/rules clean dh clean dh_testdir dh_auto_clean dh_clean dpkg-source -b helloworld-0.1 dpkg-source: Information: Quellformat 3.0 (quilt) wird verwendet dpkg-source: Information: helloworld wird unter Benutzung des existierenden ./helloworld_0.1.orig.tar.gz gebaut dpkg-source: Information: helloworld wird in helloworld_0.1-1.debian.tar.xz gebaut dpkg-source: Information: helloworld wird in helloworld_0.1-1.dsc gebaut debian/rules build dh build dh_testdir dh_auto_configure dh_auto_build dh_auto_test fakeroot debian/rules binary dh binary dh_testroot dh_prep dh_auto_install dh_installdocs dh_installchangelogs dh_perl dh_link dh_compress dh_fixperms dh_strip dh_makeshlibs dh_shlibdeps dh_installdeb dh_gencontrol dpkg-gencontrol: Warnung: Feld Depends von Paket helloworld: unbekannte Substitutionsvariable ${shlibs:Depends} dh_md5sums dh_builddeb dpkg-deb: Paket helloworld wird in ../helloworld_0.1-1_amd64.deb gebaut. dpkg-genchanges <../helloworld_0.1-1_amd64.changes dpkg-genchanges: kompletter Quellcode beim Hochladen hinzufügen dpkg-source --after-build helloworld-0.1 dpkg-buildpackage: Alles hochzuladen (Originalquellen enthalten) signfile helloworld_0.1-1.dsc Sie benötigen eine Passphrase, um den geheimen Schlüssel zu entsperren. Benutzer: 'Frank Hofmann (Hofmann EDV) < [email protected] > ' 4096-Bit RSA Schlüssel, ID D431AC07, erzeugt 2014-09-05 

4.1. กำลังตรวจสอบแพ็คเกจ

ขอแสดงความยินดี คุณสร้างแพ็คเกจ Debian สำเร็จแล้ว ใช่แล้ว! ตอนนี้เรามาดูแพ็คเกจกันดีกว่า ที่นี่ 'lintian' เข้ามามีบทบาท เครื่องมือนี้จะตรวจสอบแพ็คเกจของคุณเพื่อค้นหาการละเมิดกฎที่เข้มงวดของแพ็คเกจ Debian ที่ต้องปฏิบัติตาม

ในการรันการทดสอบให้พิมพ์คำสั่งต่อไปนี้:

lintian helloworld_0.1-1_amd64.deb 

เครื่องมือนี้ไม่พบการละเมิดกฎ แต่ยังรวมถึงการสะกดผิดและอักขระที่ไม่ถูกต้อง สวิตช์ `–pedantic' ขอให้ 'lintian' มีความสำคัญมากกว่าปกติมาก ดังที่คุณเห็นด้านล่าง `lintian' ค่อนข้างไม่พอใจและได้ค้นพบคำเตือนสามข้อและข้อผิดพลาดหนึ่งข้อ

ยกเว้นการเตือนครั้งแรก เราสามารถทำให้ 'lintian' มีความสุขและปรับเนื้อหาในแพ็คเกจได้อย่างง่ายดายตามกฎที่ตั้งไว้ คำเตือน `new-package-should-close-itp-bug` หมายความว่าไม่มีรายงานข้อบกพร่องเกี่ยวกับแพ็คเกจ ITP (ITP หมายถึง _intended to package_) สำหรับแพ็คเกจ Debian ปกติ จะต้องส่งรายงานจุดบกพร่องไปยังตัวติดตามจุดบกพร่องสำหรับแพ็คเกจ ITP เพื่อแจ้งผู้อื่นว่าคุณตั้งใจที่จะเริ่มบรรจุภัณฑ์ซอฟต์แวร์นี้

4.2. คำเตือน: `readme-debian-contains-debmake-template

ไฟล์ 'README.Debian' มีวัตถุประสงค์เพื่อเก็บบันทึกเพิ่มเติมเกี่ยวกับแพ็คเกจนี้ `dh_make` สร้างไฟล์นี้ให้เรา:

helloworld for Debian --------------------- -- Frank Hofmann < [email protected] > Sat, 04 Nov 2017 21:16:13 +0100 

ในตัวอย่างของเรา เราไม่มีข้อมูลเพิ่มเติม ดังนั้นเราจึงสามารถลบไฟล์ได้

4.3. คำเตือน: `description-starts-with-leading-spaces`

คำเตือนนี้เกิดขึ้นเนื่องจากคำอธิบายที่ยาวขึ้นของแพ็คเกจของเราในไฟล์ `debian/control' เริ่มต้นด้วยช่องว่างมากกว่าหนึ่งช่อง ทันทีที่เราลบช่องว่างเดียว คำเตือนจะหายไป

4.4. ข้อผิดพลาด: `description-synopsis-is-duplicated`

แต่ละแพ็คเกจต้องการทั้งคำอธิบายแบบสั้นและแบบยาวใน `debian/control' ข้อผิดพลาดนี้เกิดขึ้นเนื่องจากคำอธิบายทั้งสองเหมือนกัน ทันทีที่เราขยายคำอธิบายที่ยาวขึ้น ข้อผิดพลาดจะหายไป


5. ลิงค์และข้อมูลอ้างอิง

- [ddr] Andreas Barth, Adam Di Carlo, Raphaël Hertzog, Lucas Nussbaum, Christian Schwarz, เอียนแจ็คสัน: ข้อมูลอ้างอิงของนักพัฒนา Debian
– [Dnmg] โจซิป โรดิน, โอซามุ อาโอกิ: คู่มือการดูแลผู้ใช้ Debian ใหม่
- [dpmb] แอ็กเซล เบ็คเคิร์ต, แฟรงค์ ฮอฟมันน์: หนังสือการจัดการแพ็คเกจเดเบียน
- [รอบต่อนาที] คู่มือนโยบายเดเบียน
- [สามารถ] บทแนะนำเกี่ยวกับบรรจุภัณฑ์เดเบียน
– [gph] คู่มือความเป็นส่วนตัวของ GNU
– [lushpaiPackage] อเล็กซ์ ลุชไป: วิธีสร้างแพ็คเกจเดเบียนจากแหล่งที่มา


6. รับทราบ

ผู้เขียนขอขอบคุณ Axel Beckert และ Gerold Rupprecht สำหรับการสนับสนุนและนักวิจารณ์ขณะเตรียมบทความนี้