Bagaimana cara saya mendapatkan dan memodifikasi kode sumber paket yang diinstal melalui apt-get?


163

Saya berasumsi bahwa semua aplikasi yang diinstal apt-getadalah open source; tetapi bagi mereka yang tersedia dengan cara itu, di mana saya bisa mendapatkan kode sumber untuk aplikasi ini serta memperbaruinya?

Saya memiliki beberapa aplikasi yang saya gunakan secara teratur yang tidak lagi dikembangkan secara aktif dan saya ingin menambahkan fitur. Di mana saya akan pergi untuk mendapatkan hak untuk memperbarui aplikasi ini?

Dalam hal ini secara khusus, saya merujuk pada paket hellanzb


7
apt-gettidak mendukung program sumber tertutup juga, jadi asumsi awal Anda salah.
Flimm

Jawaban:


183

Gunakan perintah apt-get source <package>(jangan gunakan sudo dengannya) untuk mengunduh sumber paket.

Dari 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.

Untuk membangun sebuah paket dari sumber, instal terlebih dahulu dependensi build:

sudo apt-get build-dep <package>  

Kemudian gunakan dpkg-buildpackageuntuk membuat .debfile. Dari Lembar Referensi Cepat APT dan Dpkg :

dpkg-buildpackage Membuat paket Debian dari pohon sumber Debian. Anda harus berada di direktori utama pohon sumber agar ini berfungsi. Penggunaan sampel:

 dpkg-buildpackage -rfakeroot -uc -b

Di mana -rfakerootmenginstruksikannya untuk menggunakan program fakeroot untuk mensimulasikan hak akses root (untuk tujuan kepemilikan), -ucsingkatan dari "Jangan secara kriptografis menandatangani changelog", dan -bsingkatan dari "Buat paket biner saja"

Di terminal, cdke direktori yang berisi sumber paket (misalnya ~/code/hellanzb-0.13) dan jalankan perintah berikut:

dpkg-buildpackage -rfakeroot -uc -b

Jika build berhasil, akan ada .debfile yang terletak di
direktori induk (mis ~/code/hellanzb_0.13-6.1_all.deb.).


bagaimana saya bisa menginstal dari sumber yang dimodifikasi. serta komit kembali untuk digunakan pengguna lain. Terima kasih!
myusuf3

1
@dustyprogrammer Memperbarui jawaban saya dengan instruksi tentang cara membuat .debpaket dari kode sumber. Adapun untuk memasukkan paket modifikasi Anda ke dalam repositori, Anda harus berbicara dengan MOTU tentang hal itu.
Yesaya

@ DoR apakah ada cara untuk membuat deb yang menginstal secara default di direktori khusus? cara yang sama kita dapat menginstal menggunakan --prefix selama proses konfigurasi? sebenarnya saya tidak dapat menemukan tarballs untuk sumber perpustakaan, itu sebabnya saya tidak dapat mengkonfigurasi --prefix, dan menginstalnya .. tetapi sumber pakages tersedia melalui apt, jadi saya berpikir untuk menginstal paket sumber dalam awalan yang diinginkan .
ashishsony

2
Jika Anda tidak ingin menggunakan sumber apt-get (misalnya saat membuat paket yang diambil dari distro lain) unduh 3 file sumber dan gunakan 'dpkg-source -x [fine] .dsc' untuk mengekstrak file dan menerapkan berbeda sebelum dpkg-buildpackage. ( ftp.debian.org/debian/doc/source-unpack.txt )
Shlomi Loubaton

Apakah sudo apt-get build-dep <package>menginstal dependensi sebagai binari? Jika demikian, ini bukan build lengkap dari sumber. Bagaimana caranya membuat build-dep menginstal dependensi dari sumber?
Hello World

21

Secara umum, Anda bisa mendapatkan sumber paket yang diinstal dengan mengikuti prosedur ini:

  1. Aktifkan repositori sumber. Buka dasbor (tombol kiri atas) dan cari sources. Itu akan memunculkan Software & Updatesprogram, jalankan itu dan pastikan Anda memiliki opsi "Kode sumber" yang dipilih:

    masukkan deskripsi gambar di sini

  2. Buka terminal dan jalankan perintah ini:

    apt-get source vlc
    

Itu akan mengunduh sumber vlc ke direktori Anda saat ini dan Anda dapat melihatnya sesuka Anda.

Tentu saja, dalam kasus vlc, Anda juga dapat mengunduhnya langsung dari situs web videolan.org: https://www.videolan.org/vlc/download-sources.html


1
Anda tidak perlu menggunakan sudo dengan 'apt-get source'
Squidly

@MrBones argh! Tidak, tentu saja tidak, kekuatan kebiasaan. Terima kasih telah menunjukkannya.
terdon

di terminal: software-properties-gtk <--- yang akan meluncurkan panel GUI "Software & Updates". (Itu tidak muncul dalam pencarian dasbor untuk saya untuk alasan apa pun.)
pestophagous

17

Anda dapat menggunakan apt-get source --compilesecara langsung:

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

Bekerja untukku. Deb. Angin di direktori Anda menjalankan perintah dari.


9
Bekerja untuk saya juga, terima kasih. Hanya satu detail tambahan: Anda dapat menginstal deb dengan.sudo dpkg -i <package>.deb
waldyrious

Solusi terbaik kecuali bahwa apt akan kembali ke versi repositori karena Anda lupa mendokumentasikan changelog dengan "dch -i".
Futal


2

Contoh minimal dengan hellopaket

Semua ini dan lebih banyak dijelaskan di: https://www.debian.org/doc/manuals/maint-guide/build.en.html

Pertama mari kita dapatkan paket sampel untuk memodifikasi sumber untuk:

sudo apt-get install hello
hello

output:

Hello, world!

Sekarang mari kita hack itu. Dapatkan sumbernya:

apt-get source hello
cd hello-*

dan buka:

vim src/hello.c

dan ubah pesan menjadi:

Hello, world hacked!

Kemudian lakukan hal yang sama pada tes jika tes menjengkelkan akan mulai gagal:

vim tests/greeting-1

Kemudian bangun kembali dengan:

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

Menjelang akhir output, dikatakan:

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

jadi itu menciptakan deb di direktori induk. Beraninya. Jadi akhirnya kami menginstal dan menguji paket yang dimodifikasi:

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

dan begitulah, itu menampilkan pesan baru:

Hello, world hacked!

Diuji pada Ubuntu 18.04.

bzrJawaban lama

TODO: ini berhenti bekerja pada Ubuntu 16.04 Xenial, gagal dengan: bzr: ERROR: Not a branch: "bzr+ssh://bazaar.launchpad.net/+branch/ubuntu/hello/".. bzr branch lp:ubuntu/wily/helloberfungsi dan bzr branch lp:ubuntu/xenial/hellogagal lagi. Untuk beberapa alasan https://code.launchpad.net/ubuntu/+source/hello tidak menunjukkan Xenial: https://web.archive.org/save/https://code.launchpad.net/ubuntu/+source /Halo

Seperti disebutkan di https://askubuntu.com/a/81889/52975 ada juga pendekatan khusus Ubuntu dengan bzr.

Dapatkan versi terbaru:

bzr branch lp:ubuntu/hello

Versi spesifik:

bzr branch lp:ubuntu/trusty/hello

Anda juga dapat menggunakan pull-lp-source:

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

Maka Anda akan dapat mengeditnya:

cd hello
vim some_file

Bangun kembali:

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

Dan instal:

sudo dpkg -i ../hello.deb

The Ubuntu panduan kemasan merupakan sumber informasi yang baik.


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/". Panduan pengemasan Ubuntu , khususnya 4.2. Mendapatkan sumber mengatakan: bzr branch ubuntu:lightdm lightdm.quickswitch bzr: ERROR: Not a branch: "bzr+ssh://bazaar.launchpad.net/+branch/ubuntu/lightdm/". Kacau sekali. :-(
Stéphane Gourichon

Digunakan pull-lp-sourcesebagai gantinya, tapi kemudian kami tidak mendapatkan repositori bzr. bzr bd -- -b -us -ucmengatakan bzr: ERROR: Not a branch: "/org/gourichon/localdata/SG/projects/sysadmin/sysadmin_ergozel/2016/2016-08-15/blouarp/lightdm-1.18.3/".: - / Terima kasih atas petunjuk apa pun.
Stéphane Gourichon

@ StéphaneGourichon hummm, saya mereproduksi Anda di Ubuntu 16.04 Xenial. Menambahkan versi spesifik berfungsi:, bzr lp:ubuntu/wily/hellotetapi karena alasan tertentu tidak ada xenialversi? Dan tidak ada yang ditampilkan di: code.launchpad.net/ubuntu/+source/hello Go figure.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

1
Terima kasih telah menjaga reproduksi. Jenis mengambil kartu yang salah, lalu. Membuka bugs.launchpad.net/ubuntu/+source/bzr/+bug/1614053 menyebutkan halaman ini.
Stéphane Gourichon

1
Lebih nyaman daripada beberapa pendekatan lainnya. Dan terima kasih untuk tips orang dalam lainnya :)
nealmcb
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.