如何从源代码更新Ubuntu软件包?

我想在Ubuntu上创建一个更新版本的network-manager-openconnect软件包。显然,我需要获取最新的软件包源代码。
bzr branch lp:~network-manager/network-manager/openconnect-ubuntu.head

然后呢?这个软件包似乎有一种通过git从最新的上游代码更新自身的方法。但是我该如何让它这样做呢?

我以为bzr是指集市-- http://bazaar.canonical.com/en/。 - Paul
2个回答

从bzr分支构建一个更新的软件包往往会因为维护者或软件包的工作方式而有很大的不同。然而,以下是一些快速且简单地更新几乎任何软件包的指南,以便推送到PPA:
获取分支:
bzr branch lp:~network-manager/network-manager/openconnect-ubuntu.head

然后切换到它,并更新更改日志:
dch -i

dch -i只是在debian/changelog中打开一个新的条目,将版本修订号增加一位。如果你想添加一个补丁,那很好,但如果你想更新到一个较新的上游软件版本,在破折号(-)之前你需要更新版本号。比如说,如果一个版本是1.2-0ubuntu1,如果你执行dch -i,它将变成1.2-0ubuntu2,这对于打补丁很好,但如果你需要一个新版本,你可能想将其改为1.3-0ubuntu1

如果你需要打补丁,现在是添加你的更改的时候了。在只有一个debian/目录的分支中,你可以使用bzr bd-do(需要bzr-builddeb软件包)切换到一个工作树,你可以在其中进行更改,使用quilt或任何补丁系统,然后输入"exit 0"将你的更改复制回来。

如果你想要一个新的上游版本,一旦changelog已经被更改,你可能会运行类似于以下命令:

debian/rules get-orig-source

通常情况下,这将从上游发布者下载正确的tarball,以便开始使用。如果需要进一步更改,请按照上述方式进行"打补丁"或更改其他 debian/ 目录中的文件,否则您就快完成了。
bzr bd -S
bzr bd会负责构建。不带参数调用它将在您的系统上开始构建,而使用-S参数调用它将告诉它准备一个源代码包,其中包括一个..._source.changes文件,这是您要上传到PPA的文件(使用dput ppa:<yourname>/<name of your ppa> <changes file>来完成上传)。
对于NetworkManager软件包来说,情况有些不同。我们来具体看一下openconnect:
bzr branch lp:~network-manager/network-manager/openconnect-ubuntu.head network-manager-openconnect

确保您还拥有所有的构建依赖项: sudo get-build-deps
获取分支后,这将读取debian/control文件并尝试下载构建network-manager-openconnect所需的所有内容。您可能还需要git。完成后,运行get-orig-source仅获取来自git的最新快照的tarball:
debian/rules get-orig-source

你会看到文本飞过,然后出现一个带有长版本号的tarball。那是你可以获取到的最新的nm-openconnect代码。
然后,你需要使用tarball中的版本号更新changelog,只需保持-0ubuntu1后缀不变。
或者,修改debian/changelog为你想要的特定版本号,然后运行: debian/rules get-current-source 由于插件变化不大,你应该能够直接从那里构建软件包,使用上面提到的bzr bd命令。如果不能,请按照需要进行任何必要的更改。
在进行更改后,别忘了执行bzr commit
我先前忘记了添加,当你所做的更改可能对他人有益时,请毫不犹豫地使用合并提案系统(在LP上链接到你的分支页面的“Propose for merging”链接)。通常情况下,你可以针对你的分支所基于的分支(例如,在这种情况下是lp:~network-manager/network-manager/openconnect-ubuntu.head)提出合并请求。

我觉得我一定忘了什么:如果是包装修复(包括补丁),不要害怕提出您的更改以合并到主包装分支,这样每个人都可以受益于更改! :) - Mathieu Trudel-Lapierre

好的,关于如何从launchpad获取代码进行更新的更新内容

bzr branch lp:~network-manager/network-manager/openconnect-ubuntu.head

这个命令是从lp(launchpad托管服务)中拉取代码。我们需要找到代码所在的位置。

man bzr
输入343 # 当man页面出现时,键入343

bzr branch FROM_LOCATION [TO_LOCATION]        
       If  the TO_LOCATION is omitted, the last component of the FROM_LOCATION
       will be used.  In other words, "branch ../foo/bar" will attempt to cre‐
       ate  ./bar.   If the FROM_LOCATION has no / or path separator embedded,
       the TO_LOCATION is derived from the FROM_LOCATION by stripping a  lead‐
       ing   scheme   or  drive  identifier,  if  any.  For  example,  "branch
       lp:foo-bar" will attempt to create ./foo-bar.

试着切换到你想要工作的目录,或者添加你和代码要去的目录。
cd /home/[你的用户名]/[开发目录的路径] 或者 bzr branch lp:~network-manager/network-manager/openconnect-ubuntu.head /home/[你的用户名]/[开发目录的路径] 例如:bzr branch lp:~network-manager/network-manager/openconnect-ubuntu.head /home/joe/projects/network-manger/dev
如果你已经这样做了,你可能在你的主目录下有一个文件夹。 ls ~ ./openconnect-ubuntu.head
这个目录中应该有一个README文件,可以查看里面应该包含什么内容,请参考项目代码,这里是一个链接到README.source的链接。
README应该包含构建该项目的指示。
其他有用的bzr工具需要安装。
sudo apt-get install bzr-builddeb bzr-builder bzr-explorer quilt
bzr-explorer可以让你在图形界面中浏览你在机器上创建的bzr仓库。
另外,你可能需要拉取整个network-manager源代码才能构建openconnect这个组件。可能会有很多依赖关系存在于不同的组件之间。
你需要为当前的openconnect包创建一个修复方案,然后使用你所使用的任何差异工具创建一个补丁,并将其发送给软件包维护者。

或者,如果您想在本地使用修复后的软件包,您可以创建一个 .deb 软件包文件。

创建软件包 这是一个相当复杂的过程,请阅读以下链接。


谢谢。但是我还不确定如何从git上拉取最新的network-manager-openconnect代码。我用bzr拉下来的文件中有一个在debian/rules中的脚本,似乎可以执行git pull,但我不知道如何正确运行这个脚本。 - James Ward
@james launchpad从gnome社区托管的nework-manager项目的git仓库中拉取上游源代码。因此,您不需要使用git来拉取仓库。阅读bzr文档并完成一些教程,以了解bzr的工作原理。否则,请查看stackoverflow上的git指南 - nelaaro
@james 简单点的方法可能是直接从这个页面底部下载.tar.gz文件,或者使用这个链接进行下载。 - nelaaro
看起来bzr有一种简单的方法可以分支,然后更新到最新的原始源代码。 - James Ward