ดาวน์โหลด source package แบบ debian

วันนี้ขอพูดถึงเรื่องเล็ก ๆ ที่หลายคนมองไม่เห็น เกี่ยวกับการดาวน์โหลดและแตกซอร์สของ debian package ที่อยู่นอก apt repository ซึ่งไม่สามารถใช้คำสั่ง apt-get source <package> ได้

ซอร์สสำหรับ debian package นั้น โดยปกติจะแยก upstream tarball กับ debian patch ออกจากกัน เป็นแฟ้ม *.orig.tar.gz และ *.diff.gz ตามลำดับ และใช้แฟ้ม *.dsc ในการสรุปรายการแฟ้มทั้งหมดที่ต้องใช้ พร้อม MD5 sum ของแต่ละแฟ้มด้วย

ดังนั้น เวลาที่เตรียมซอร์สในแหล่งดาวน์โหลด จึงมักต้องมีอย่างน้อย 2-3 แฟ้มสำหรับแต่ละแพกเกจ ที่ต้องมีแน่ ๆ คือ *.dsc และ upstream tarball และอีกแฟ้มหนึ่งที่ต้องมีสำหรับแพกเกจทั่วไปที่ไม่ใช่ debian native คือ *.diff.gz ซึ่งเก็บส่วนต่างจาก upstream

แต่เวลาดาวน์โหลด ก็ไม่ใช่ว่าต้องแยกสั่งดาวน์โหลดทีละแฟ้มด้วย wget ในเมื่อ debian มีเครื่องมือสำหรับดาวน์โหลด source package มาให้อยู่แล้ว คือ dget อยู่ในแพกเกจ devscripts เวลาจะดาวน์โหลด ก็แค่สั่ง dget ตามด้วย URL ของแฟ้ม *.dsc เช่น

$ dget http://linux.thai.net/debian/pool/main/libt/libthai/libthai_0.1.9-3.dsc
dget: retrieving http://linux.thai.net/debian/pool/main/libt/libthai/libthai_0.1.9-3.dsc
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   949  100   949    0     0   2989      0 --:--:-- --:--:-- --:--:--     0
dget: retrieving http://linux.thai.net/debian/pool/main/libt/libthai/libthai_0.1.9.orig.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  479k  100  479k    0     0  91784      0  0:00:05  0:00:05 --:--:--  103k
dget: retrieving http://linux.thai.net/debian/pool/main/libt/libthai/libthai_0.1.9-3.diff.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  6806  100  6806    0     0  18999      0 --:--:-- --:--:-- --:--:-- 75973
libthai_0.1.9-3.dsc:
      Good signature found
   validating libthai_0.1.9.orig.tar.gz
   validating libthai_0.1.9-3.diff.gz
All files validated successfully.
$ ls -F
libthai_0.1.9-3.diff.gz  libthai_0.1.9-3.dsc  libthai_0.1.9.orig.tar.gz

สำหรับ devscripts ตั้งแต่รุ่น 2.10.17 ขึ้นไป dget จะแตก source package พร้อม apply debian patch ให้ด้วยโดยปริยาย แต่สำหรับรุ่นที่เก่ากว่านั้น ต้องใช้ตัวเลือก -x ถ้าจะให้แตกด้วย หรือมิฉะนั้น ก็ใช้คำสั่ง dpkg-source ตัวเลือก -x ในการแตก โดยระบุแฟ้ม *.dsc ของแพกเกจที่ต้องการเช่น

$ dpkg-source -x libthai_0.1.9-3.dsc
dpkg-source: extracting libthai in libthai-0.1.9
dpkg-source: unpacking libthai_0.1.9.orig.tar.gz
dpkg-source: applying ./libthai_0.1.9-3.diff.gz
$ ls -F
libthai-0.1.9/           libthai_0.1.9-3.dsc
libthai_0.1.9-3.diff.gz  libthai_0.1.9.orig.tar.gz

การแตกซอร์สด้วย dpkg-source นี้ แตกต่างจากการแตก tarball แล้ว patch ด้วยแฟ้ม *.diff.gz ตรง ๆ ในบางกรณี เช่น ในกรณีที่ upstream tarball ใช้ชื่อไดเรกทอรีที่รูปแบบผิดปกติ เช่น ไม่ได้ระบุเลขรุ่นในไดเรกทอรีที่แตก หรือระบุเลขรุ่นด้วย *-v2.0 หรือแม้แต่ไม่ใช้ไดเรกทอรีเลย แต่แตกแฟ้มต่าง ๆ ออกมาตรง ๆ ในไดเรกทอรีปัจจุบัน ฯลฯ ซึ่งในกรณีเหล่านี้ dpkg-source จะเปลี่ยนชื่อไดเรกทอรีให้อยู่ในรูปแบบปกติของ debian คือ <package>-<version> ให้ ก่อนที่จะ patch ด้วย *.diff.gz

ตัวเลือกอื่น ๆ ที่น่าสนใจของ dget:

  • -d (สำหรับ devscripts 2.10.17 ขึ้นไป) ดาวน์โหลดเท่านั้น ไม่ต้องแตกซอร์ส
  • -x แตกซอร์สหลังดาวน์โหลดด้วย
  • -u (สำหรับ devscripts 2.10.17 ขึ้นไป) ไม่ต้องตรวจสอบลายเซ็น GPG ของเจ้าของแฟ้ม *.dsc
  • --build ดาวน์โหลดแล้ว แตกซอร์สและ build deb ให้ด้วย

รายละเอียดอื่น ๆ อ่านได้จาก manpage ของ dget(1) ครับ

Comments

โอ้ ความรู้ใหม่จ้า ขอบคุณครับ

มีประโยชน์มากครับผม

ขอบคุณครับ

ลองใช้ดูแล้วสะดวกดีครับ

แต่เพิ่งพบว่า มัน resume file แบบ wget ไม่ได้ - -'

Creative Commons License ลิขสิทธิ์ของบทความเป็นของเจ้าของบทความแต่ละชิ้น
ผลงานนี้ ใช้สัญญาอนุญาตของครีเอทีฟคอมมอนส์แบบ แสดงที่มา-อนุญาตแบบเดียวกัน 3.0 ที่ยังไม่ได้ปรับแก้