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 데비안 소스 트리에서 데비안 패키지를 만듭니다 . 이 작업을 수행하려면 소스 트리의 기본 디렉토리에 있어야합니다. 샘플 사용법 :

 dpkg-buildpackage -rfakeroot -uc -b

어디 -rfakeroot(소유 목적) 루트 권한을 시뮬레이션 할 fakeroot 사용 프로그램을 사용하도록 지시, -uc"암호 변경 로그에 서명하지 않음"을 의미하고, -b"단지 바이너리 패키지 빌드"의 약자

터미널 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를 사용하여 설치할 수있는 것과 같은 방법? 실제로 라이브러리의 소스에 대한 tarball을 찾을 수 없기 때문에 --prefix를 구성하고 설치할 수 없습니다. pakages 소스는 apt를 통해 사용할 수 있으므로 원하는 접두사에 소스 패키지를 설치하려고했습니다. .
ashishsony

2
apt-get 소스를 사용하지 않으려면 (예 : 다른 배포판에서 가져온 패키지를 빌드 할 때) 3 개의 소스 파일을 다운로드하고 'dpkg-source -x [fine] .dsc'를 사용하여 파일을 추출하고 dpkg-buildpackage 전에 diffs. ( ftp.debian.org/debian/doc/source-unpack.txt )
Shlomi Loubaton

sudo apt-get build-dep <package>종속성을 바이너리로 설치 합니까 ? 그렇다면 소스에서 완전히 빌드 된 것이 아닙니다. 소스에서 빌드-뎁 설치 의존성을 어떻게 만드는가?
Hello World

21

일반적으로 다음 절차에 따라 설치된 패키지의 소스를 얻을 수 있습니다.

  1. 소스 리포지토리를 활성화하십시오. 대시 보드 (왼쪽 상단 버튼)를 열고을 검색하십시오 sources. Software & Updates프로그램을 불러 와서 실행하고 "소스 코드"옵션이 선택되어 있는지 확인하십시오 :

    여기에 이미지 설명을 입력하십시오

  2. 터미널을 열고 다음 명령을 실행하십시오.

    apt-get source vlc
    

그러면 Vlc의 소스가 현재 디렉토리로 다운로드되며 여가 시간에 볼 수 있습니다.

물론의 경우 vlcvideolan.org 웹 사이트 ( https://www.videolan.org/vlc/download-sources.html) 에서 직접 다운로드 할 수도 있습니다.


1
'apt-get source'와 함께 sudo를 사용할 필요는 없습니다
Squidly

@MrBones 아아! 물론, 당신은 습관의 힘을하지 않습니다. 지적 해 주셔서 감사합니다.
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
고맙습니다. 추가 세부 정보 하나만 :sudo dpkg -i <package>.deb
waldyrious

"dch -i"를 사용하여 변경 로그를 문서화하는 것을 잊었 기 때문에 apt는 저장소 버전으로 되돌아갑니다.
Futal


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!

우분투 18.04에서 테스트되었습니다.

이전 bzr답변

TODO : 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 에서 언급했듯이 와 함께 우분투 특정 접근 방식이 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/". 우분투 패키징 안내서 , 특히 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
재생산을 처리해 주셔서 감사합니다. 그렇다면 잘못된 카드를 골랐습니다. 이 페이지를 언급 ​​한 bugs.launchpad.net/ubuntu/+source/bzr/+bug/1614053을 열었 습니다 .
Stéphane Gourichon

1
다른 접근 방식보다 편리합니다. 그리고 다른 내부자 팁에 감사드립니다 :)
nealmcb
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.