讨论一下 Borg

用Borg主要还是因为 straight.el 太慢了(可能是我网络慢吧…),而且有些包无法用 straight.el 安装。

Borg基本就是一个裸奔包管理器,简单粗暴 less magic,主要就是利用 git submodules,结合 magit 很好用。目前看来,修改文件之后不会自动生成 autoloads,需要稍微配置下。

Borg 已经可以和 package.el 一起用了,melpa 的插件用 package.el,fork 魔改的插件用 Borg,值得一试。

2 个赞

我目前的做法是从 melpa 安装 borg,然后:

;;; borg
(require 'borg)
(borg-initialize)

再把下面这段代码放到 kill-emacs-hook 里:

  (let ((libs (directory-files
               (locate-user-emacs-file "lib/")
               nil directory-files-no-dot-files-regexp)))
    (dolist (lib libs)
      (borg-update-autoloads lib)))

跟我差不多(package.el配合git),不过我是用shallow clone

使用submodule有一个坏处是需要自己维护想使用哪个commit,而straight.el就可以 不用管这个。

现在 Borg 好像比较成熟了,今年的 Emacs Conf 2021 有人还分享了 Borg 的使用流程视频介绍。感觉还不错,打算试试。 论坛内的道友有使用的吗?分享一下体验?

我在用,我是基于Centaur Emacs,把包管理部分换成了 borg, 然后再往上加自己的配置。目前工作流比较顺畅了。

  1. 包管理和配置管理分开,因为包平时动得少,不出问题也懒得升级。
  2. 个人配置也作为一个包,当时担心 borg make 是按字母顺序 build的,名字取得靠后,叫 z-init。这样做就要是 magit submodule在windows上性能不好。修改单一repo,频繁修改也不怕。

我以前主要是会在机器之间同步配置,经常需要用 Diff-compare,比对后覆盖。现在都在git里面了,直接用git的patch,方便不少。最近还跟作者讨论下,安装完包后,在 borg-initialize 中去掉对 git调用的依赖。Split package add/remove management and personal config management · Discussion #118 · emacscollective/borg · GitHub

多谢分享,git 在 Windows下确实比较慢。今天用 bootstrap 那个项目试了一下,安装了 vertico,在Windows 上启动时间都要 2.6s 了 。

请问一下,我老的项目(100个包左右)迁移过来,难道要一个个 borg-clone?感觉好费力啊。没法直接解析 init.el 中的 use-package 关键字来自动 clone,像 straight 那样比较简单一些。

我翻了下,这是当时的安装笔记:

  1. git clone GitHub - emacscollective/emacs.g: The Emacs Collective .emacs.d
  2. change .gitmodules file. Modify all “git@” to “https://” and all “com:” to “com/”. That use https instead of ssh
  3. git submodule sync
  4. git submodule update –init
  5. make build

(defun my-install ( pkgs)
(let* (pkg url)
  (dolist (el pkgs)
    (setq pkg (epkg (symbol-name el)))
    (setq url (and pkg
		           (if (or (epkg-git-package-p pkg)
			               (epkg-github-package-p pkg)
			               (epkg-orphaned-package-p pkg)
			               (epkg-gitlab-package-p pkg))
		               (eieio-oref pkg 'url)
		             (eieio-oref pkg 'mirror-url))))
    (when url
      (pcase-dolist (`(,orig . ,base) borg-rewrite-urls-alist)
        (when (string-prefix-p orig url)
          (setq url (concat base (substring url (length orig)))))))
    (when url
      (print el)
      (condition-case err
	      (borg-assimilate (symbol-name el) url)
	   	    (error                        ; Condition.
	   	     (message "%s" (error-message-string err)) ))) ) ) )
3 个赞

我的办法比较low。当时是先将 Centaur Emacs安装好,有200多个包,那就到包的lisp目录,找出用了些什么包,dired拷贝出来,去掉日期后缀,编辑出一个包的列表,然后用 my-install 这个函数慢慢安装。

这个就是在 borg-initialize 中,多次调用 git 进程。我上面提到的那个讨论,里面的代码可以只是在修改包后,首次加载时调用,然后像 doom-emacs 一样生成一个大的 autoloads, 再次启动时直接加载就行了。当然可能不太完善,但目前还没碰到问题。

看你和作者的讨论,他并不打算再实现这个功能。 Windows 用户需要更多的关爱 :grinning:

所以我用那段代码实现了,目前已经能工作。最大的方便就是所有都在git 中。我这个想法避免了在.emacs.d根目录下调用git status的慢,因为平时修改就在我自己的z-init中,涉及到包的管理才在.emacs.d目录下,慢也次数少点。

我回头试试你的方案。

我一直在用。

  • 处理依赖需要 submodule 自己添加
  • clone 路径不可以包含.el 例如 lib/dash.el 必须改为 lib/dash, 否则无法识别path
  • 可以配合 auto-compile 实现载入或者修改library时候自动编译为elc和eln

你使用 auto-compile 不会引起启动慢吗?我之前用 purcell 配置的时候,这个包会引起启动慢很多。 还提过一个issue,Automatic byte compilation cause startup and loading org-mode slow · Issue #765 · purcell/emacs.d · GitHub ,特别是 Windows 下更加严重。

综合下来,现在暂时考虑用 straight 了,从 use-package 迁移更加方便一点。 感觉 Borg 就是手动挡,straight 相当于自动挡 :smile:,不过 borg 和 magit 集成的更好。

我用的是emacsclient, 所以启动速度无所谓。。

其实也可以不用auto-compile,因为完全可以在命令行实现:

  1. submodule update
  2. make build

我包装了一个命令,make update-build , 可以只编译更新的submodule为elc,好像也可以直接在命令行编译成eln,有个branch build-native,我待会试一下。

1 个赞

用 straight 的速度也不快,我原来用package.el + use-pacskage 的配置 启动时 0.9s 的,到了 straight 要 3s 以上。

看来鱼和熊掌不可兼得,用Git 子模块版本控制好,速度稍微慢点。

请问下 borg-clones 这个命令是不是用来批量克隆多个包的?

straight 慢可能是因为每次启动 check 比较费时?我关了之后启动时间比 package 快近一倍(macOS上)

关闭哪个check?在哪里设置?

GitHub - radian-software/straight.el: 🍀 Next-generation, purely functional package manager for the Emacs hacker. 反正我这 straight 启动和 package 差不多,autoload 放到了一个文件带来的优化去掉 check 就能看出来了