use-package复数依赖的配置

不是问题,就是单纯讨论讨论。

有的时候一个A包配置需要B和C同时存在才能正常工作,但是由于A,B和C之间没有直接的依赖关系,use-package:after 选项不是很合适。这种依赖你们的配置是怎么解决的?

我目前是用

;; 例子
(use-package A
  :config
    (after-load| B
      (after-load| C
        (config))))

;; after-load| 的定义
(defmacro after-load| (feature &rest rest-list)
  "A smart wrapper around `with-eval-after-load'.

FEATURE is a library declared with `provide'.
REST-LIST is a list of expressions to evaluate.

If FEATURE loaded, rest-list is evaluated.
If not, this macro will befave like `with-eval-after-load'.

Expressions inside will be called right after the library is loaded,
before `post-config|' but after `post-init'."
  (declare (indent defun) (debug t))
  `(if (featurep ',feature)
        (progn ,@rest-list)
      (with-eval-after-load ',feature ,@rest-list)))
(use-package A :config (require 'B) (require 'C))
1 个赞

卧槽,好像没问题。

你这是 use-package 用多了把最基本的依赖管理忘了吧。

在autoload和各种宏的路上走太远了……

直接 require B 和 C,这两个包会自动下载吗?还是需要另外的 (use-package B ...) ?

至今没有使用 use-package,我是自己定了一套写法:

(feature-packages
 '((A :source (git "http://~/a.git")
      :requires (B C)
      ...)))

其实对于楼主说的依赖,我理解是有两种情况:

  1. 立即配置 A,但是先下载 B 和 C,使配置流程得以继续。

  2. 推迟配置 A,等到 B 和 C 在别的文件下载并且 require 之后,再启动 A 的配置

    推迟的原因是,B 和 C 在别的文件里有一些的前置设置,如果这里早早的 require,那些前置参数就没用上了。

如果是built-in的package,用use-package怎么写呢?

也是 require 啊,build in 只是相当于打包在了一起,没有一开始就载入。

(use-package abbrev :ensure nil)
1 个赞

:souce:require是怎么实现的? OwO