我可以直接更新源代码安装的软件吗?

虽然自从我开始使用Ubuntu近一年后,我还没有尝试从源代码安装软件。 我实际上并没有发现需要这样做。 但是现在我正在开发一个处于存储库中候选发布阶段的软件,但最新的稳定版本的源代码可以在软件主页上找到。

我了解到,如果软件具有很多依赖性,那么从源代码安装可能会很困难。 但是,如果我解决这个问题,我会对最新版本感到满意。 但我一直想知道这样的软件是否可以自动更新,或者我是否必须运行一些脚本来更新软件包。 或者更糟糕的是我是否必须从头开始重新安装每个更新?

此外,我很想知道从上面以外的源安装是否有任何特定的优势。

最好注意,软件的依赖性很少会改变。 如果您已经成功编译了一次软件,那么任何后续版本都应该易于编译 – 所有依赖项都应该已经满足。

如果您是从源代码编译的,则没有.deb或类似的软件包可用于更新, 除非您等待分发将该软件包含到其存储库中,或者等到开发人员的PPA更新。

简单地说,有人必须首先编译它以使其成为deb。 编译旧版本不会让您自动更新,您仍然需要完成整个“download-configure-compile-install”过程。

但是 ,如果要在多台计算机上安装相同的版本,将编译后的版本打包为.deb (或类似版本)并将其分发给这些计算机是有意义的。 如果完成,依赖关系将自动拉入。

至于从源代码安装的优势,我能想到的只有两个:

  • 您可以访问最新版本的代码,并且可以选择稳定版本或尖端版本(通常称为夜间版本,最新版本等)
  • Ubuntu / other-distribution可能不希望将软件包含在他们的存储库中。 在这种情况下,您会遇到开发人员或社区提供的源代码或软件包。 也就是说,你别无选择,只能使用这些来源。

根据这篇文章,您可以在编译源代码后生成.deb包。 然后,您可以从.deb包安装而不是“make install”。 这使得更新更容易(如果它在某个存储库中),因为包将由跟踪更新的包管理器管理。

如果从源代码构建包“some-package”并且存在依赖关系,您可以尝试“apt-get build-dep some-package”来自动安装编译包所需的所有依赖项,而无需手动跟踪每个依赖自己。 这样,依赖关系也由包管理器管理,并且也应自动更新。

git用户的另一个替代方案值得一提:

你也可以在早期的git clone之后使用git pull来更新你的源代码,然后根据需要重新编译你的程序。 (您也可以使用git进一步跟踪文件:请参阅此处的答案 。)

如果您最初使用git clone来获取源代码,例如,

 git clone git://github.com/person/programname.git 

并且在编译和安装后保留了该文件夹,你可以cd到该文件夹​​并运行git pull来获取最新的提交。 然后删除您可能已创建的任何构建目录和/或运行make clean (如果适用),然后再次编译软件并使用checkinstall安装它, checkinstall也会为您创建一个软件包(虽然不适合分发)。

但是,如果您正在帮助开发一个程序并需要在每天每次git pull之后重新编译,那么您可能会安装到home文件夹,因为每次都不需要安装到/usr/local/ hierarchy。

作为一个例子,如果我正在测试并经常重新编译程序,我会在使用git pull和run(对于这个特定程序)获取最新提交后cd到我的构建文件夹:

 cmake .. -DCMAKE_BUILD_TYPE=Debug -DLAYOUT=home -DPREFIX=home 

然后编译调试版本进行测试。

但是,如果您只是想每个月左右编译一个新版本的git克隆程序(并且没有测试或调试它),通常会使用checkinstall安装到/usr/local/ hierarchy。

要从源代码管理您的安装,请在此处查看我的答案: 如何更新从源代码编译的软件包?