Làm cách nào để lấy và sửa đổi mã nguồn của các gói được cài đặt thông qua apt-get?


163

Tôi giả định rằng tất cả các ứng dụng được cài đặt thông qua apt-getlà nguồn mở; nhưng đối với những ứng dụng có sẵn theo cách đó, tôi có thể lấy mã nguồn ở đâu cho các ứng dụng này cũng như cập nhật chúng?

Tôi có một vài ứng dụng tôi sử dụng thường xuyên mà không được tích cực phát triển nữa và tôi muốn thêm các tính năng. Tôi sẽ đi đâu để có quyền cập nhật các ứng dụng này?

Trong trường hợp này cụ thể, tôi đang đề cập đến gói hellanzb


7
apt-getcũng hỗ trợ các chương trình nguồn đóng, vì vậy giả định ban đầu của bạn là không chính xác.
Flimm

Câu trả lời:


183

Sử dụng lệnh apt-get source <package>(không sử dụng sudo với nó) để tải xuống nguồn của gói.

Từ 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.

Để xây dựng gói từ nguồn, trước tiên hãy cài đặt phụ thuộc bản dựng:

sudo apt-get build-dep <package>  

Sau đó sử dụng dpkg-buildpackageđể tạo một .debtập tin. Từ Bảng tham khảo nhanh APT và Dpkg :

dpkg-buildpackage Xây dựng gói Debian từ cây nguồn Debian. Bạn phải ở trong thư mục chính của cây nguồn để làm việc này. Sử dụng mẫu:

 dpkg-buildpackage -rfakeroot -uc -b

Trường hợp -rfakeroothướng dẫn nó sử dụng chương trình fakeroot để mô phỏng các đặc quyền gốc (cho mục đích sở hữu), -uclà viết tắt của "Đừng ký mã hóa thay đổi" và -bviết tắt của "Chỉ xây dựng gói nhị phân"

Trong một thiết bị đầu cuối, cdvào thư mục chứa nguồn gói (ví dụ ~/code/hellanzb-0.13) và chạy lệnh sau:

dpkg-buildpackage -rfakeroot -uc -b

Nếu quá trình xây dựng thành công, sẽ có một .debtệp nằm trong
thư mục mẹ (ví dụ ~/code/hellanzb_0.13-6.1_all.deb).


Làm thế nào tôi có thể cài đặt từ nguồn sửa đổi. cũng như cam kết lại cho người dùng khác sử dụng. Cảm ơn!
myusuf3

1
@dustyprogrammer Cập nhật câu trả lời của tôi với hướng dẫn tạo .debgói từ mã nguồn. Đối với việc đưa gói sửa đổi của bạn vào kho lưu trữ, bạn nên nói chuyện với Bộ GTVT về điều đó.
Ê-sai

@DoR có cách nào để tạo một deb để cài đặt mặc định trong một thư mục tùy chỉnh không? giống như cách chúng ta có thể cài đặt bằng cách sử dụng --prefix trong quá trình định cấu hình? thực sự tôi không thể tìm thấy tarball cho nguồn của thư viện, đó là lý do tại sao tôi không thể cấu hình --prefix và cài đặt nó .. nhưng nguồn pakages đó có sẵn thông qua apt, vì vậy tôi đã nghĩ đến việc cài đặt gói nguồn trong tiền tố mong muốn .
ashishsony

2
Nếu bạn không muốn sử dụng nguồn apt-get (ví dụ: khi xây dựng gói được lấy từ bản phân phối khác), hãy tải xuống 3 tệp nguồn và sử dụng 'dpkg-source -x [fine] .dsc' để giải nén các tệp và áp dụng khác trước khi đóng gói dpkg. ( ftp.debian.org/debian/doc/source-unpack.txt )
Shlomi Loubaton

sudo apt-get build-dep <package>cài đặt các phụ thuộc như nhị phân? Nếu vậy, đây không phải là một bản dựng hoàn chỉnh từ nguồn. Làm thế nào để thực hiện phụ thuộc cài đặt build-dep từ nguồn?
Xin chào thế giới

21

Nói chung, bạn có thể lấy nguồn của gói đã cài đặt bằng cách làm theo quy trình này:

  1. Cho phép các kho nguồn. Mở bảng điều khiển (nút trên cùng bên trái) và tìm kiếm sources. Điều đó sẽ đưa ra Software & Updateschương trình, chạy chương trình đó và đảm bảo bạn có tùy chọn "Mã nguồn" được chọn:

    nhập mô tả hình ảnh ở đây

  2. Mở một thiết bị đầu cuối và chạy lệnh này:

    apt-get source vlc
    

Điều đó sẽ tải các nguồn của vlc vào thư mục hiện tại của bạn và bạn có thể xem chúng một cách thoải mái.

Tất nhiên, trong trường hợp vlc, bạn cũng có thể tải chúng trực tiếp từ trang web videolan.org: https://www.videolan.org/vlc/doad-source.html


1
Bạn không cần sử dụng sudo với 'apt-get source'
Squidly

@MrBones argh! Không, tất nhiên là bạn không, ép buộc thói quen. Cảm ơn đã chỉ ra điều đó.
terdon

trong thiết bị đầu cuối: phần mềm-property-gtk <--- sẽ khởi chạy bảng GUI "Phần mềm & Cập nhật". (Nó không xuất hiện trong bảng điều khiển tìm kiếm cho tôi vì bất kỳ lý do gì.)
pestophagous

17

Bạn có thể sử dụng apt-get source --compiletrực tiếp:

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

Đã làm cho tôi. Các .deb cuộn lên trong thư mục bạn đã chạy lệnh từ.


9
Làm việc cho tôi là tốt, cảm ơn. Chỉ cần thêm một chi tiết: bạn có thể cài đặt .deb vớisudo dpkg -i <package>.deb
waldyrious

Giải pháp tốt nhất ngoại trừ apt sẽ trở lại phiên bản kho lưu trữ vì bạn đã quên ghi lại tài liệu thay đổi bằng "dch -i".
Tương lai


2

Ví dụ tối thiểu với hellogói

Tất cả những điều này và hơn thế nữa được mô tả tại: https://www.debian.org/doc/manuals/maint-guide/build.en.html

Trước tiên, hãy lấy gói mẫu để sửa đổi nguồn cho:

sudo apt-get install hello
hello

đầu ra:

Hello, world!

Bây giờ hãy hack nó lên. Lấy nguồn:

apt-get source hello
cd hello-*

và mở ra:

vim src/hello.c

và sửa đổi thông báo thành:

Hello, world hacked!

Sau đó làm tương tự trong bài kiểm tra nếu không bài kiểm tra gây phiền nhiễu sẽ bắt đầu thất bại:

vim tests/greeting-1

Sau đó xây dựng lại với:

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

Gần cuối của đầu ra, nó nói:

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

Vì vậy, nó đã tạo .deb trên thư mục cha, làm sao dám. Vì vậy, cuối cùng chúng tôi cài đặt và kiểm tra gói sửa đổi:

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

và ở đó bạn đi, nó xuất ra thông báo mới:

Hello, world hacked!

Đã thử nghiệm trên Ubuntu 18.04.

bzrCâu trả lời cũ

TODO: điều này đã ngừng hoạt động trên Ubuntu 16.04 Xenial, không thành công với : bzr: ERROR: Not a branch: "bzr+ssh://bazaar.launchpad.net/+branch/ubuntu/hello/".. bzr branch lp:ubuntu/wily/hellohoạt động và bzr branch lp:ubuntu/xenial/hellothất bại một lần nữa. Vì một số lý do https://code.launchpad.net/ubfox/+source/hello không hiển thị Xenial: https://web.archive.org/save/https://code.launchpad.net/ubfox/+source /xin chào

Như đã đề cập tại https://askubfox.com/a/81889/52975 cũng có một cách tiếp cận dành riêng cho Ubuntu bzr.

Nhận phiên bản mới nhất:

bzr branch lp:ubuntu/hello

Phiên bản cụ thể:

bzr branch lp:ubuntu/trusty/hello

Bạn cũng có thể sử dụng pull-lp-source:

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

Sau đó, bạn sẽ có thể chỉnh sửa nó:

cd hello
vim some_file

Xây dựng lại nó:

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

Và cài đặt nó:

sudo dpkg -i ../hello.deb

Các hướng dẫn đóng gói Ubuntu là một nguồn thông tin tốt.


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/". Hướng dẫn đóng gói Ubuntu , cụ thể là 4.2. Lấy nguồn nói: bzr branch ubuntu:lightdm lightdm.quickswitch bzr: ERROR: Not a branch: "bzr+ssh://bazaar.launchpad.net/+branch/ubuntu/lightdm/". Thật là một mớ hỗn độn. :-(
Stéphane Gourichon

Được sử dụng pull-lp-sourcethay thế, nhưng sau đó chúng tôi không nhận được một kho lưu trữ bzr. bzr bd -- -b -us -ucnói bzr: ERROR: Not a branch: "/org/gourichon/localdata/SG/projects/sysadmin/sysadmin_ergozel/2016/2016-08-15/blouarp/lightdm-1.18.3/".: - / Cảm ơn cho bất kỳ gợi ý.
Stéphane Gourmetichon

@ StéphaneGourichon hummm, tôi sao chép bạn trên Ubuntu 16.04 Xenial. Thêm phiên bản cụ thể hoạt động: bzr lp:ubuntu/wily/hellonhưng vì lý do nào đó không có xenialphiên bản? Và không có chương trình nào trên: code.launchpad.net/ubfox/+source/hello Go hình.
Ciro Santilli 心 心

1
Cảm ơn đã chăm sóc sinh sản. Loại chọn nhầm thẻ, sau đó. Đã mở bug.launchpad.net/ubfox/+source/bzr/+orms/1614053 đề cập đến trang này.
Stéphane Gourmetichon

1
Thuận tiện hơn một số phương pháp khác. Và cảm ơn về những lời khuyên trong cuộc khác :)
nealmcb
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.