如何在我的elisp包中优雅地删除对旧版emacsen的支持?

Rya*_*son 10 emacs compatibility packaging elisp

我维护了一个相当好用的emacs包(ido-ubiquitous),在下一个版本中,我打算放弃对Emacs 23及以下版本的支持.使用Emacs 23及以下版本的用户将能够继续使用我当前版本的软件包.

但是,我不希望让Emacs 23用户通过ELPA或git或其他东西升级,最终得到与他们的emacs不兼容的新版本.是否有一种普遍接受的方式来优雅地处理这个问题?我有没有选择将新版本重命名为"ido-ubiquitous-ng"或其他什么?

lun*_*orn 7

ELPA/package.el

要通过package.el阻止更新,请将特殊依赖项添加(emacs "24.1")Package-Requires列表中.请参阅Emacs Lisp手册中的库标题,在Package-Requires:标题的描述中:

[...]包代码自动定义名为"emacs"的包,其中包含当前运行的Emacs的版本号.这可用于要求包的最小版本的Emacs.

为Emacs 23及以下独立分发的package.el 提供此特殊包.因此,任何在Emacs 23上安装软件包的尝试都将失败,并显示一条消息,抱怨"emacs"无法安装,从而保留旧的兼容版本.

但是,在使用它时,请准备好处理来自Emacs 24用户的投诉.许多用户package.el在升级到Emacs 24时显然不会删除旧版本.因此旧版本package.el会覆盖新的内置版本,导致安装时出现虚假错误.


ELGet

我不认识Elget.可能会要求其作者在这件事上提供帮助.


Git子模块,Tarballs和其他遗留方法

如果用户以传统方式安装您的软件包(例如Git子模块,分发软件包等),我认为您无法真正阻止更新.您只能更新软件包之后抱怨,这可能为时已晚,因为现在已经存在不兼容的代码.

您可以选择添加详细的显式版本检查error.不过,我认为这是多余的.如果您真的使用Emacs 24,那么您将使用不兼容的功能,因此无论您是否明确地阻止它,您的包都无法成功加载.所以省去多余的代码:)


TL; DR(+个人经历)

首先,请不要重命名您的包裹.很少有用户可以在每个已安装的软件包上关注新闻.因此,许多用户不会立即意识到该软件包已重命名,并且在没有通知或警告的情况下继续使用过时的版本.实际上,你会惩罚你的软件包的Emacs 24用户.

添加特殊依赖项以防止通过package.el进行意外更新.添加突出的文档,您的软件包需要Emacs 24,就像您的Github自述文件的第一部分一样.然后,让事情休息.任何其他事情都可能更值得麻烦.

根据我的个人经验,Emacs用户并不愚蠢(好吧,至少大多数用户不是).他们阅读文档.他们理解文档.

Emacs 23的用户知道他们的Emacs已经过时了.他们中的许多人都期望不兼容和破损.如果软件包突然中断,他们将在Github上寻求建议,意识到该软件包不再适用于Emacs 23,并且要么返回上一个工作版本,要么(希望)升级他们的Emacs.

  • 无论包管理器依赖性如何,请确保(假设您的库处于版本控制!),在开始对主干进行黑客攻击之前,您将为库的Emacs 23版本创建一个分支.这样,用户至少保留从存储库中获取兼容版本的能力(并且使用适当的el-get源/配方,可以从Emacs 23分支特别安装和更新). (2认同)