如何获取和修改通过apt-get安装的软件包的源代码?


162

我假设所有通过安装的应用程序apt-get都是开源的;但是对于以这种方式可用的那些,我在哪里可以获取这些应用程序的源代码并进行更新?

我有一些经常使用的应用程序,这些应用程序已经不再积极开发,我想添加功能。我在哪里可以获得更新这些应用程序的权利?

在这种情况下,我指的是hellanzb软件包


7
apt-get确实也支持封闭源程序,因此您最初的假设是不正确的。
Flimm 2013年

Answers:


182

使用命令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程序模拟root特权(出于所有权目的),-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之前的差异。(ftp.debian.org/debian/doc/source-unpack.txt
施洛米Loubaton

是否sudo apt-get build-dep <package>将依赖项安装为二进制文件?如果是这样,则这不是完整的源代码。如何使build-dep从源代码安装依赖项?
Hello World

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'一起使用
鱿鱼

@MrBones啊!不,你当然不习惯。感谢您指出。
terdon

在终端中:software-properties-gtk <---将启动“软件和更新” GUI面板。(无论出于什么原因,它都没有出现在仪表板搜索中。)
食虫的,

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”记录变更日志。
致命


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答案

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所述,还有一种特定于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

Ubuntu的包装引导是一个很好的信息源。


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/". 真是一团糟。:-(
斯特凡纳·古里科

用于pull-lp-source代替,但我们没有得到一个BZR库。bzr bd -- -b -us -ucbzr: ERROR: Not a branch: "/org/gourichon/localdata/SG/projects/sysadmin/sysadmin_ergozel/2016/2016-08-15/blouarp/lightdm-1.18.3/".:-/谢谢你的提示。
斯特凡纳·古里科

@StéphaneGourichon嗯,我在Ubuntu 16.04 Xenial上重现了您。添加特定版本有效:bzr lp:ubuntu/wily/hello,但是由于某种原因,没有xenial版本?而且没有显示在:code.launchpad.net/ubuntu/+source/hello上图。
Ciro Santilli新疆改造中心法轮功六四事件

1
感谢您照顾复制。然后,选择了错误的卡。打开提及此页面的bugs.launchpad.net/ubuntu/+source/bzr/+bug/1614053
斯特凡纳·古里科

1
比其他方法更方便。并感谢其他内幕技巧:)
nealmcb
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.