Jak uzyskać i zmodyfikować kod źródłowy pakietów zainstalowanych za pomocą apt-get?


162

Zakładam, że wszystkie zainstalowane aplikacje apt-getsą oprogramowaniem typu open source; ale w przypadku tych, które są dostępne w ten sposób, gdzie mogę uzyskać kod źródłowy dla tych aplikacji, a także je zaktualizować?

Mam kilka aplikacji, z których regularnie korzystam, które nie są już aktywnie rozwijane i chciałbym dodać funkcje. Gdzie mogę uzyskać prawa do aktualizacji tych aplikacji?

W tym przypadku konkretnie mam na myśli pakiet hellanzb


7
apt-getobsługuje również programy o zamkniętym źródle, więc twoje początkowe założenie jest nieprawidłowe.
Flimm,

Odpowiedzi:


182

Użyj polecenia apt-get source <package>(nie używaj z nim sudo), aby pobrać źródło pakietu.

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

Aby zbudować pakiet ze źródła, najpierw zainstaluj zależności kompilacji:

sudo apt-get build-dep <package>  

Następnie użyj, dpkg-buildpackageaby utworzyć .debplik. Z szybkiej instrukcji APT i Dpkg :

dpkg-buildpackage Buduje pakiet Debian z drzewa źródeł Debiana. Aby to zadziałało, musisz znajdować się w głównym katalogu drzewa źródłowego. Przykładowe użycie:

 dpkg-buildpackage -rfakeroot -uc -b

Gdzie -rfakerootinstruuje go, aby używał programu fakeroot do symulacji uprawnień administratora (do celów własności), -ucoznacza „Nie podpisuj dziennika zmian kryptograficznie” i -boznacza „Zbuduj tylko pakiet binarny”

W terminalu przejdź cddo katalogu zawierającego źródło pakietu (np. ~/code/hellanzb-0.13) I uruchom następującą komendę:

dpkg-buildpackage -rfakeroot -uc -b

Jeśli kompilacja się powiedzie, .debw
katalogu nadrzędnym będzie znajdować się plik (np ~/code/hellanzb_0.13-6.1_all.deb.).


jak mogę zainstalować ze zmodyfikowanego źródła. a także zatwierdzić go z powrotem dla innych użytkowników. Dzięki!
myusuf3

1
@dustyprogrammer Zaktualizowałem moją odpowiedź instrukcjami dotyczącymi tworzenia .debpakietu z kodu źródłowego. Jeśli chodzi o przeniesienie zmodyfikowanego pakietu do repozytoriów, powinieneś porozmawiać o tym z MOTU .
Izajasza

@DoR czy istnieje sposób, aby utworzyć deb, który instaluje się domyślnie w niestandardowym katalogu? w ten sam sposób, w jaki możemy zainstalować przy użyciu --prefiks podczas procesu konfiguracji? Właściwie nie mogę znaleźć plików tar dla źródła biblioteki, dlatego nie mogę skonfigurować - prefiksu i dokonać instalacji. Ale to źródło pakietów jest dostępne przez apt, więc pomyślałem o zainstalowaniu pakietu źródłowego w żądanym prefiksie .
ashishsony

2
Jeśli nie chcesz używać apt-get source (na przykład podczas budowania pakietu pobranego z innej dystrybucji), pobierz 3 pliki źródłowe i użyj „dpkg-source -x [fine] .dsc”, aby wyodrębnić pliki i zastosować diffs przed dpkg-buildpackage. ( ftp.debian.org/debian/doc/source-unpack.txt )
Shlomi Loubaton

Czy sudo apt-get build-dep <package>instaluje zależności jako pliki binarne? Jeśli tak, to nie jest to pełna kompilacja ze źródła. Jak sprawić, by kompilacje instalacyjne były instalowane ze źródła?
Hello World,

21

Ogólnie rzecz biorąc, źródło zainstalowanego pakietu można uzyskać, wykonując następującą procedurę:

  1. Włącz repozytoria źródłowe. Otwórz pulpit nawigacyjny (lewy górny przycisk) i wyszukaj sources. To powinno uruchomić Software & Updatesprogram, uruchomić go i upewnić się, że masz zaznaczoną opcję „Kod źródłowy”:

    wprowadź opis zdjęcia tutaj

  2. Otwórz terminal i uruchom następujące polecenie:

    apt-get source vlc
    

Spowoduje to pobranie źródeł vlc do bieżącego katalogu i można je przeglądać w dowolnym momencie.

Oczywiście w przypadku vlcmożna je również pobrać bezpośrednio ze strony internetowej videolan.org: https://www.videolan.org/vlc/download-sources.html


1
Nie powinieneś używać sudo z 'apt-get source'
Squidly

@MrBones argh! Nie, oczywiście, że nie, siła przyzwyczajenia. Dzięki za zwrócenie na to uwagi.
terdon

w terminalu: software-properties-gtk <---, który uruchomi panel GUI „Oprogramowanie i aktualizacje”. (Z jakiegoś powodu nie pojawił się w poszukiwaniu mnie na desce rozdzielczej.)
pestofagiczny

17

Możesz użyć apt-get source --compilebezpośrednio:

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

Pracował dla mnie. .Deb kończy się w katalogu, z którego uruchomiono polecenie.


9
Pracowałem również dla mnie, dzięki. Jeszcze jeden dodatkowy szczegół: możesz zainstalować .deb zsudo dpkg -i <package>.deb
waldyrious

Najlepsze rozwiązanie oprócz tego, że apt powróci do wersji repozytorium, ponieważ zapomniałeś udokumentować dziennik zmian za pomocą „dch -i”.
Futal


2

Minimalny przykład z hellopakietem

Wszystko to i więcej opisano w: https://www.debian.org/doc/manuals/maint-guide/build.en.html

Najpierw zdobądźmy przykładowy pakiet do modyfikacji źródła dla:

sudo apt-get install hello
hello

wyjścia:

Hello, world!

Teraz zhakujmy to. Uzyskaj źródło:

apt-get source hello
cd hello-*

i otwórz:

vim src/hello.c

i zmodyfikuj wiadomość, aby:

Hello, world hacked!

Następnie zrób to samo na teście, w przeciwnym razie denerwujący test zacznie się nie powieść:

vim tests/greeting-1

Następnie odbuduj za pomocą:

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

Pod koniec wyjścia napisano:

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

więc utworzył .deb w katalogu nadrzędnym, jak śmiesz. Wreszcie instalujemy i testujemy zmodyfikowany pakiet:

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

i proszę bardzo, wyświetla nową wiadomość:

Hello, world hacked!

Testowane na Ubuntu 18.04.

Stara bzrodpowiedź

TODO: ten przestał działać na Ubuntu 16.04 Xenial, w przypadku braku z: bzr: ERROR: Not a branch: "bzr+ssh://bazaar.launchpad.net/+branch/ubuntu/hello/".. bzr branch lp:ubuntu/wily/hellodziała i bzr branch lp:ubuntu/xenial/helloznowu nie działa. Z jakiegoś powodu https://code.launchpad.net/ubuntu/+source/hello nie wyświetla Xenial: https://web.archive.org/save/https://code.launchpad.net/ubuntu/+source /cześć

Jak wspomniano na https://askubuntu.com/a/81889/52975, istnieje również podejście specyficzne dla Ubuntu bzr.

Pobierz najnowszą wersję:

bzr branch lp:ubuntu/hello

Konkretna wersja:

bzr branch lp:ubuntu/trusty/hello

Możesz także użyć pull-lp-source:

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

Następnie będziesz mógł go edytować:

cd hello
vim some_file

Odbuduj to:

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

I zainstaluj:

sudo dpkg -i ../hello.deb

Przewodnik po opakowaniach Ubuntu jest dobrym źródłem informacji.


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/". Przewodnik po opakowaniach Ubuntu , w szczególności 4.2. Zdobycie źródła mówi: bzr branch ubuntu:lightdm lightdm.quickswitch bzr: ERROR: Not a branch: "bzr+ssh://bazaar.launchpad.net/+branch/ubuntu/lightdm/". co za bałagan. :-(
Stéphane Gourichon

Używane pull-lp-sourcezamiast tego, ale nie otrzymujemy repozytorium bzr. bzr bd -- -b -us -ucmówi bzr: ERROR: Not a branch: "/org/gourichon/localdata/SG/projects/sysadmin/sysadmin_ergozel/2016/2016-08-15/blouarp/lightdm-1.18.3/".: - / Dzięki za podpowiedź.
Stéphane Gourichon

@ Hummm StéphaneGourichon, odtwarzam cię na Ubuntu 16.04 Xenial. Dodanie konkretnej wersji działa: bzr lp:ubuntu/wily/helloale z jakiegoś powodu nie ma xenialwersji? I żaden nie pojawia się na: code.launchpad.net/ubuntu/+source/hello Go.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

1
Dziękujemy za zajęcie się reprodukcją. Więc wybrałem niewłaściwą kartę. Otwarto bugs.launchpad.net/ubuntu/+source/bzr/+bug/1614053 wspominając o tej stronie.
Stéphane Gourichon,

1
Wygodniejsze niż niektóre inne podejścia. I dzięki za inne wskazówki od
wtajemniczonych
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.