我一直在构建自己的 emacs,因为我想修复其中的一些问题并将错误修复程序推送到上游。但是,Ubuntu 一直自动删除我自己构建的 emacs,我不得不不断重建并重新安装它。
apt-cache policy emacs
这是我昨晚睡觉时的输出:
~/emacs$ sudo apt-cache policy emacs
emacs:
Installed: 26.0.50.aaron-1
Candidate: 46.1
Version table:
46.1 500
500 http://us.archive.ubuntu.com/ubuntu xenial/main amd64 Packages
500 http://us.archive.ubuntu.com/ubuntu xenial/main i386 Packages
*** 26.0.50.aaron-1 100
100 /var/lib/dpkg/status
这是我醒来时的样子:
~/emacs$ sudo apt-cache policy emacs
[sudo] password for excelsiora:
emacs:
Installed: 46.1
Candidate: 46.1
Version table:
*** 46.1 500
500 http://us.archive.ubuntu.com/ubuntu xenial/main amd64 Packages
500 http://us.archive.ubuntu.com/ubuntu xenial/main i386 Packages
100 /var/lib/dpkg/status
为什么这个软件包的版本是 46 而不是 24 或 25?26 是目前您可以获得的最高主要 emacs 版本。
我可以看到这是一个元包:https://packages.debian.org/source/jessie/emacs-defaults
为什么 Ubuntu 不经询问就更新软件?
主要问题:我应该怎么做 - 为我的软件包版本分配一个高于 46 的数字才能使其坚持下去?
这看起来像是一个糟糕的黑客行为,或者也许这就是它应该如何工作?
答案1
这里有很多问题和疑问,所以我会简短地讲一下,但尽量涵盖所有问题。
emacs
只是一个指向emacs...
Ubuntu 中最新版本的元包(目前为emacs24
)。“46.1”只是一个包版本,故意设置得比较高,以取代较旧的 emacs 包。请参阅apt show emacs
了解更多信息。您正在
emacs
用版本号较低的软件包覆盖该软件包。Ubuntu 按版本号优先安装软件包。版本号最高的软件包将被安装(安装或升级时),因此您的软件包会不断被抢购一空。您可以在
apt-cache policy emacs
输出中看到这一点。候选版本是较高版本。您可以通过固定优先级或伪造版本号(高于 46.1 的版本号)来解决此问题,但这样做会忽略问题(并且可能会保留一个
emacs24
包)。最好的选择是删除该
emacs
包,然后只构建和安装一个emacs25
或emacs26
包。你可以还可以构建一个依赖于版本名称包的 emacs 元包,但这只是虚荣心作祟。除非你打算分发,否则我不会这么做。关于 Ubuntu 不“询问”就执行某些操作,请检查是否已打开自动更新。获取最新可用更新是默认行为,因此我认为这更像是“不了解 Ubuntu 的功能”而不是机器中的幽灵,或者更糟的情况。
至于“为什么是 24 版本,而不是 25 或 26 版本?”,Ubuntu 和其下的 Debian 都致力于提供稳定、经过测试的软件版本。26 版本仍在开发中,而 25 版本直到 2016 年 9 月才发布。
此外,Ubuntu 不是滚动发布版本,因此 Ubuntu 24 版本将在 Ubuntu 发行版的整个生命周期内一直使用 24 版本(除非发生非常疯狂的情况)。如有必要,将移植并应用安全补丁,但版本仍为 24。
答案2
为什么 Ubuntu 不经询问就更新软件?
我认为这可能是由于更新管理器(编辑菜单)中的更新策略所致。我建议使用中间选项:优化稳定性和安全性。最后一个选项是“始终更新所有内容”——您不希望出现这种情况。
您还可以在编辑>首选项>黑名单包(又称为忽略包)中将包“emacs-defaults”列入黑名单。
答案3
根据@Oli 的回答,您可以这样做:
删除 emacs 包并仅构建和安装 emacs25 或 emacs26 包。
- 找到你的 emacs.deb 文件。对我来说,它在我的 emacs 源根文件夹中,名为
emacs_25.1-1_amd64.deb
- 创建一个目录来保存您要创建的新 Debian 包:
$ mkdir emacs-rename
- 将 debian 包解压到以下目录:
$ ar -x emacs_25.1-1_amd64.deb emacs-rename/
- 进入 emacs-rename 目录:
$ cd emacs-rename
- 进一步提取 control.tar.gz 和 data.tar.xz:
$ tar -xzf control.tar.gz
并$ tar -xf data.tar.xz
- 使用 nano编辑
control
结果文件(因为您还没有 emacs ;) -$ nano control
并将其更改Package: emacs
为Package: emacs25
(或 26、27 等) - 在 emacs-rename: 内创建一个 DEBIAN 目录
$ mkdir DEBIAN
并将控制文件复制到那里:$ cp control DEBIAN/
- 进入上一级目录,返回 emacs 源根目录 (
$ cd ..
) 并运行$ dpkg --build emacs-rename
。这可能需要一些时间。 - 您现在应该有一个 emacs-rename.deb 包。不用担心它不符合正确的 debian 包命名结构,它只是供您使用。使用以下命令安装它
$ sudo dpkg -i emacs-rename.pkg
- 如果一切正常你应该看到:
准备解压 emacs-rename.deb ...
正在解压 emacs25 (25.1-1) ...
设置 emacs25 (25.1-1) ...