降级通过MELPA安装的软件包的最简单方法


22

有时,来自MELPA的软件包更新可能会破坏emacs的某些部分,当这种情况发生时,我希望能够恢复使用较旧版本的软件包。

现在,我可以通过两种方式做到这一点:

  • 我已将emacs设置为通过移至回收站来删除文件,并且在更新软件包时,旧版本已被回收站。我可以检索较旧的版本并替换其中的一个~/.emacs.d/elpa

  • 转到破坏功能的软件包的github存储库,获取该软件包的较旧版本,将其替换为~/.emacs.d/elpagitub中的一个,对字节进行字节重新编译。

这两种方式都涉及大量的手动工作。是否有一种更简便(最好是自动)的方式来降级从MELPA安装的软件包?


4
您只能通过ELPA / package.el安装最新版本,Melpa和Melpa-stable甚至都不会保留旧版本的软件包。要手动安装软件包,1)下载源代码2)M-x package-install-file。除了ELPA / package.el之外,还有其他管理软件包的方法,例如el-getquelpa,它们似乎可以在没有ELPA的情况下使用,也许它们可以完成您想做的事情。
xuchunyang '16

2
如果你没有得到一个简单可行的回答这个问题,请考虑派遣一个增强请求Emacs的:M-x report-emacs-bug(这也是增强请求)。
Drew

Answers:


9

通过M-x list-packages界面更新软件包时,成功安装软件包后,系统会询问您是否要删除旧软件包。不要删除它们,以便它们保留在原处,然后您可以稍后通过此界面删除较新的软件包。

我当前的软件包列表显示了〜/ .emacs.d / elpa /目录树中安装的magit的4个版本。

  magit              20160827.1549 obsolete              A Git porcelain inside Emacs
  magit              20160907.945  obsolete              A Git porcelain inside Emacs
  magit              20161001.1454 obsolete              A Git porcelain inside Emacs
  magit              20161123.617  installed             A Git porcelain inside Emacs

您可以稍后使用键~(package-menu-mark-obsolete-for-deletion)清除旧版本,以标记所有过时的软件包。要删除某个旧版本,请移至其行,然后按d将其标记为删除。标记软件包后,您将x照常使用它们来执行操作。

Emacs 25中,将所有软件包标记为Upgrade功能会自动将所有旧软件包设置为删除,并且安装后不会提示您确认。您必须查找以大写字母“ D”开头的行,您只需取消标记即可(最好使用以下宏)

在以下几行中,在短划线的左侧键入键或和弦。

<F3>  - start macro recording
C-s   - isearch-forward
C-q   - quoted-insert
C-j   - linefeed character
D     - the mark at the start of the line
<Ret> - stops the isearch on the line with the "D"
u     - unmark the package for deletion
<F4>  - stops macro recording - the first package is now unmarked
<F4>  - executes the macro for the next upgraded package

如果没有进一步的搜索匹配,宏将响起并停止,因此您可以C-u 0 <F4>取消标记所有要删除的软件包的标记。在此之后,您可以x退出安装。

我在注释中声明要更改的函数必须以一种我无法掌握的方式进行更改,因为最后一个(条件)块必须成功才能避免循环不断,这一点很重要。


哦,嘿,它不要求确认以删除我的emacs。它只是删除了旧软件包://我认为它曾经在emacs 24中问过?我不记得了
Chakravarthy Raghunandan

确实。Emacs 24提示,25似乎将旧标记标记为删除,这将在执行标记时触发。您可以手动标记要安装的软件包,也可以不标记删除项或更改(t (package-menu-mark-delete))行,package-menu--mark-upgrades-1以便第一行是对配置变量的测试,或者是nil当您不想立即删除旧软件包时返回的内容
p_wiersig

您能否package.el在原始答案中添加相关行以进行编辑,以便我接受答案?谢谢
Chakravarthy Raghunandan

当然。我注意到我无法使函数执行我想要的操作,因此我解释了如何通过宏取消标记所有功能。
p_wiersig

7

实际上,“核选项”是package.el完全放弃,而是使用我编写的程序包管理器straight.el。好处是可以straight.el通过克隆Git存储库来安装软件包,从而可以轻松使用所需的任何版本。此外,straight.el还提供了用于处理修订锁定文件的功能,该功能使您可以记录软件包管理配置的确切状态,直至最小的细节。然后,在紧急情况下,您可以简单地将所有软件包恢复为已知的良好版本。

通常,使用这类操作是不可能的package.el,并且由于总体设计的原因,它们永远是不可能的。

为了满足您每次更新软件包时避免提交的愿望,使用不需要这样做straight.el。我建议编写一个版本锁定文件,并在每次更新软件包时都提交该版本,因为那样将无法进入升级后Emacs配置被破坏并且您不知道如何还原的状态。但是,如果您喜欢边缘生活,就不必这样做。


4

我找到一种简单的降级方法:管理自己的Melpa存档。

  1. 克隆melpa回购。
  2. 按照melpa的自定义melpa存档Wiki页面删除所有食谱。
  3. 找到您要降级的包的提交,并使用该包的提交创建一个新配方。(请参阅有关如何指定提交的melpa自述文件
  4. 运行make以构建降级的软件包
  5. 将您自己的melpa存档(可以是本地目录)添加到package-archives列表中。
  6. 使用“程序包”菜单安装降级的程序包。或者,您可以package-pinned-packages用来限制应从中下载软件包的档案。

3

许多人选择不将ELPA软件包提交到​​版本控制中,但这就是为什么我认为您应该这样做的一个示例。

如果所有内容都已提交,则还原所有内容都是微不足道的。

取决于上游ELPA封装的状态是有风险的。


但这意味着每次更新软件包时,我都必须记住要提交。那不是我想要的 还是有一种方法可以使我每当进行软件包更新时使emacs自动登台并提交更新的软件包?
Chakravarthy Raghunandan

1
我不明白为什么您不希望对配置进行更改是故意的决定。关于自动提交,我敢肯定这可以是自动化的,但是我没有解决方案。但是,搜索这样的解决方案可能会有所帮助。
菲利普斯,2016年
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.