ฉันจะรับและแก้ไขซอร์สโค้ดของแพ็คเกจที่ติดตั้งผ่าน apt-get ได้อย่างไร


163

ฉันสมมติว่าแอปพลิเคชันทั้งหมดที่ติดตั้งผ่านapt-getเป็นโอเพ่นซอร์ส แต่สำหรับผู้ที่มีในลักษณะนั้นฉันจะหาซอร์สโค้ดสำหรับแอปพลิเคชั่นเหล่านี้รวมทั้งอัปเดตได้ที่ไหน

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

ในกรณีนี้โดยเฉพาะฉันหมายถึงแพคเกจhellanzb


7
apt-getสนับสนุนโปรแกรมโอเพนซอร์สเช่นกันดังนั้นสมมติฐานเริ่มต้นของคุณไม่ถูกต้อง
Flimm

คำตอบ:


183

ใช้คำสั่งapt-get source <package>(อย่าใช้ sudo กับมัน) เพื่อดาวน์โหลดซอร์สของแพ็คเกจ

จากman apt-get:

   source
       source causes apt-get to fetch source packages. APT will examine the
       available packages to decide which source package to fetch. It will then
       find and download into the current directory the newest available version of
       that source package while respect the default release, set with the option
       APT::Default-Release, the -t option or per package with the pkg/release
       syntax, if possible.

       Source packages are tracked separately from binary packages via deb-src type
       lines in the sources.list(5) file. This means that you will need to add such
       a line for each repository you want to get sources from. If you don't do
       this you will properly get another (newer, older or none) source version
       than the one you have installed or could install.

       If the --compile option is specified then the package will be compiled to a
       binary .deb using dpkg-buildpackage, if --download-only is specified then
       the source package will not be unpacked.

       A specific source version can be retrieved by postfixing the source name
       with an equals and then the version to fetch, similar to the mechanism used
       for the package files. This enables exact matching of the source package
       name and version, implicitly enabling the APT::Get::Only-Source option.

       Note that source packages are not tracked like binary packages, they exist
       only in the current directory and are similar to downloading source tar
       balls.

ในการสร้างแพ็คเกจจากซอร์สขั้นแรกให้ติดตั้งการขึ้นต่อกันของการสร้าง:

sudo apt-get build-dep <package>  

จากนั้นใช้dpkg-buildpackageเพื่อสร้าง.debไฟล์ จากเอกสารอ้างอิงด่วนของ APT และ Dpkg :

dpkg-buildpackageสร้างแพ็คเกจ Debian จากแผนผังต้นกำเนิด Debian คุณต้องอยู่ในไดเรกทอรีหลักของแผนผังต้นกำเนิดเพื่อให้มันใช้งานได้ ตัวอย่างการใช้งาน:

 dpkg-buildpackage -rfakeroot -uc -b

โดยที่-rfakerootสั่งให้ใช้โปรแกรม fakeroot เพื่อจำลองสิทธิ์การใช้งานรูท (เพื่อจุดประสงค์ในการเป็นเจ้าของ) -ucย่อมาจาก "อย่าเซ็นสัญญาเปลี่ยนรหัส" และ-bย่อมาจาก "Build the binary package เท่านั้น"

ในเทอร์มินัลให้cdเข้าไปในไดเรกทอรีที่มีซอร์สแพ็กเกจ (เช่น~/code/hellanzb-0.13) และรันคำสั่งต่อไปนี้:

dpkg-buildpackage -rfakeroot -uc -b

หากการสร้างสำเร็จจะมี.debไฟล์อยู่ใน
ไดเรกทอรีหลัก(เช่น~/code/hellanzb_0.13-6.1_all.deb)


ฉันจะติดตั้งจากแหล่งที่แก้ไขได้อย่างไร รวมถึงมอบให้ผู้ใช้อื่นใช้ ขอบคุณ!
myusuf3

1
@dustyprogrammer อัปเดตคำตอบของฉันพร้อมคำแนะนำในการสร้าง.debแพ็คเกจจากซอร์สโค้ด สำหรับการนำแพ็กเกจที่คุณแก้ไขไปยังที่เก็บคุณควรพูดคุยกับMOTUเกี่ยวกับเรื่องนั้น
อิสยาห์

@DoR มีวิธีสร้าง deb ที่ติดตั้งตามค่าเริ่มต้นในไดเรกทอรีที่กำหนดเองหรือไม่ เช่นเดียวกับที่เราสามารถติดตั้งโดยใช้ --prefix ในระหว่างกระบวนการกำหนดค่า ที่จริงฉันไม่สามารถหา tarballs สำหรับแหล่งที่มาของห้องสมุดที่ว่าทำไมฉันไม่สามารถกำหนดค่า - คำนำหน้าและทำการติดตั้ง .. แต่แหล่ง pakages สามารถใช้ได้ผ่าน apt ดังนั้นฉันจึงคิดที่จะติดตั้งแพคเกจแหล่งในคำนำหน้าที่ต้องการ .
Ashishsony

2
หากคุณไม่ต้องการใช้แหล่งที่มา apt-get (เช่นเมื่อสร้างแพ็คเกจที่มาจาก distro อื่น) ให้ดาวน์โหลดไฟล์ต้นฉบับ 3 ไฟล์และใช้ 'dpkg-source -x [fine] .dsc' เพื่อแยกไฟล์และใช้ diffs ก่อน dpkg-buildpackage ( ftp.debian.org/debian/doc/source-unpack.txt )
Shlomi Loubaton

ไม่sudo apt-get build-dep <package>ติดตั้งการอ้างอิงเป็นไบนารี? ถ้าเป็นเช่นนั้นนี่ไม่ใช่งานสร้างที่สมบูรณ์จากแหล่งที่มา วิธีใดที่ทำให้การติดตั้ง build-dep พึ่งพาจากซอร์ส?
สวัสดีชาวโลก

21

โดยทั่วไปคุณสามารถรับซอร์สของแพ็คเกจที่ติดตั้งโดยทำตามขั้นตอนนี้:

  1. เปิดใช้งานแหล่งเก็บข้อมูลต้นฉบับ เปิดแผงควบคุม (ปุ่มซ้ายบน) sourcesและค้นหา ควรเปิดSoftware & Updatesโปรแกรมเรียกใช้และตรวจสอบให้แน่ใจว่าคุณได้เลือกตัวเลือก "ซอร์สโค้ด":

    ป้อนคำอธิบายรูปภาพที่นี่

  2. เปิดเทอร์มินัลและเรียกใช้คำสั่งนี้:

    apt-get source vlc
    

ที่จะดาวน์โหลดแหล่งที่มาของ vlc ไปยังไดเรกทอรีปัจจุบันของคุณและคุณสามารถดูได้ในยามว่าง

แน่นอนในกรณีvlcคุณสามารถดาวน์โหลดได้โดยตรงจากเว็บไซต์ videolan.org: https://www.videolan.org/vlc/download-sources.html


1
คุณไม่จำเป็นต้องใช้ sudo กับ 'apt-get source'
Squidly

@MrBones argh! ไม่แน่นอนคุณทำไม่ได้พลังของนิสัย ขอบคุณที่ชี้นำ
terdon

ในเทอร์มินัล: software-properties-gtk <--- ที่จะเปิดแผง GUI "ซอฟต์แวร์และการอัพเดท" (มันไม่ปรากฏขึ้นในแผงควบคุมค้นหาฉันไม่ว่าด้วยเหตุผลใด)
pestophagous

17

คุณสามารถใช้apt-get source --compileโดยตรง:

sudo apt-get build-dep <package>
sudo apt-get source --compile <package>

ทำงานให้ฉัน .deb ปรากฏขึ้นในไดเรกทอรีที่คุณรันคำสั่ง


9
ทำงานให้ฉันด้วยเช่นกันขอบคุณ เพียงหนึ่งรายละเอียดเพิ่มเติม: คุณสามารถติดตั้ง. deb ด้วยsudo dpkg -i <package>.deb
waldyrious

ทางออกที่ดีที่สุดยกเว้นว่า apt จะเปลี่ยนกลับเป็นเวอร์ชันของที่เก็บเพราะคุณลืมบันทึกเอกสารการเปลี่ยนแปลงด้วย "dch -i"
Futal

3

ในการรับข้อมูลเพิ่มเติมเกี่ยวกับแพ็คเกจรวมถึง URL ต้นน้ำและผู้ติดต่อโครงการ / โปรแกรมคุณสามารถดูไฟล์ลิขสิทธิ์ (อ้างอิงจากpackages.debian.org )

/usr/share/doc/$package_or_program_name/copyrightเมื่อแพคเกจถูกรวมและติดตั้งในระบบของคุณคุณยังสามารถอ่านไฟล์ลิขสิทธิ์โดยตรงที่

ดูวิธีการดาวน์โหลดซอร์สโค้ดของแพ็คเกจเดเบียน .


2

ตัวอย่างที่น้อยที่สุดกับhelloแพคเกจ

ทั้งหมดนี้และอื่น ๆ มีการอธิบายไว้ที่: https://www.debian.org/doc/manuals/maint-guide/build.en.html

ก่อนอื่นมารับแพ็คเกจตัวอย่างเพื่อแก้ไขซอร์สสำหรับ:

sudo apt-get install hello
hello

เอาท์พุท:

Hello, world!

ตอนนี้เรามาแฮ็คมันกันเถอะ รับแหล่งที่มา:

apt-get source hello
cd hello-*

และเปิด:

vim src/hello.c

และแก้ไขข้อความเป็น:

Hello, world hacked!

จากนั้นทำแบบเดียวกันกับการทดสอบมิฉะนั้นการทดสอบที่น่ารำคาญจะเริ่มล้มเหลว:

vim tests/greeting-1

จากนั้นสร้างใหม่ด้วย:

sudo apt-get install devscripts
sudo apt-get build-dep hello
debuild -b -uc -us

ใกล้ถึงจุดสิ้นสุดของเอาต์พุตมันบอกว่า:

dpkg-deb: building package 'hello' in '../hello_2.10-1build1_amd64.deb'.

ดังนั้นมันจึงสร้าง. deb บนไดเรกทอรีหลักวิธีที่กล้า ในที่สุดเราก็ทำการติดตั้งและทดสอบแพ็คเกจที่แก้ไขแล้ว:

sudo dpkg -i ../hello_2.10-1build1_amd64.deb
hello

และไปที่นั่นมันส่งข้อความใหม่:

Hello, world hacked!

ทดสอบบน Ubuntu 18.04

bzrคำตอบเก่า

สิ่งที่ต้องทำ: นี้หยุดทำงานบน Ubuntu 16.04 Xenial bzr: ERROR: Not a branch: "bzr+ssh://bazaar.launchpad.net/+branch/ubuntu/hello/".ล้มเหลวด้วย: bzr branch lp:ubuntu/wily/helloทำงานและbzr branch lp:ubuntu/xenial/helloล้มเหลวอีกครั้ง ด้วยเหตุผลบางอย่างhttps://code.launchpad.net/ubuntu/+source/helloไม่แสดง Xenial: https://web.archive.org/save/https://code.launchpad.net/ubuntu/+source /สวัสดี

เป็นที่กล่าวถึงในhttps://askubuntu.com/a/81889/52975นอกจากนี้ยังมีวิธีการ Ubuntu bzrเฉพาะกับ

รับรุ่นล่าสุด:

bzr branch lp:ubuntu/hello

รุ่นเฉพาะ:

bzr branch lp:ubuntu/trusty/hello

คุณยังสามารถใช้pull-lp-source:

sudo apt-get install ubuntu-dev-tools
pull-lp-source hello

จากนั้นคุณจะสามารถแก้ไขได้:

cd hello
vim some_file

สร้างใหม่:

dch -i 
debcommit
bzr bd -- -b -us -uc

และติดตั้งมัน:

sudo dpkg -i ../hello.deb

คู่มือบรรจุภัณฑ์อูบุนตูเป็นแหล่งที่ดีของข้อมูล


bzr branch lp:ubuntu/hello bzr: ERROR: Not a branch: "bzr+ssh://bazaar.launchpad.net/+branch/ubuntu/hello/". bzr branch lp:ubuntu/xenial/lightdm bzr: ERROR: Not a branch: "bzr+ssh://bazaar.launchpad.net/+branch/ubuntu/xenial/lightdm/". คู่มือบรรจุภัณฑ์ Ubuntuเฉพาะ4.2 แหล่งที่มาพูดว่า: bzr branch ubuntu:lightdm lightdm.quickswitch bzr: ERROR: Not a branch: "bzr+ssh://bazaar.launchpad.net/+branch/ubuntu/lightdm/". ช่างเป็นเรื่องยุ่ง :-(
Stéphane Gourichon

ใช้pull-lp-sourceแทน แต่เราไม่ได้รับที่เก็บ bzr bzr bd -- -b -us -ucพูดว่าbzr: ERROR: Not a branch: "/org/gourichon/localdata/SG/projects/sysadmin/sysadmin_ergozel/2016/2016-08-15/blouarp/lightdm-1.18.3/".: - / ขอบคุณสำหรับคำใบ้ใด ๆ
Stéphane Gourichon

@ StéphaneGourichon hummm ฉันทำซ้ำคุณใน Ubuntu 16.04 Xenial การเพิ่มรุ่นเฉพาะทำงาน: bzr lp:ubuntu/wily/helloแต่ด้วยเหตุผลบางอย่างไม่มีxenialรุ่น? และไม่มีใครแสดงบน: code.launchpad.net/ubuntu/+source/hello Go figure
Ciro Santilli 新疆改造中心法轮功六四事件

1
ขอบคุณสำหรับการดูแลการทำซ้ำ ชนิดของการเลือกบัตรผิดแล้ว เปิดบั๊ก .launchpad.net/ubuntu/+source/bzr/+bug/1614053พูดถึงหน้านี้
Stéphane Gourichon

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