unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
From: Mekeor Melire <mekeor@posteo.de>
To: help-gnu-emacs@gnu.org
Subject: Use package-vc.el for declarative, source-based package management?
Date: Mon, 15 Apr 2024 09:51:32 +0000	[thread overview]
Message-ID: <87plurnecb.fsf@posteo.de> (raw)

Hello :)

I'm trying to use Emacs' built-in package-vc.el for an opinionated way
of declarative, source-based package management. I use Emacs from master
branch and I would like to use some Elpa-packages from their respective
development branch too. I also want local checkouts of their
repositories so that I can quickly contribute to them. And I do not want
to use Emacs' built-in use-package.el. Ideally, my init.el would begin
like this:

  ;; Here, I'd maintain a list of packages that I want to be installed:
  (setopt package-vc-...-list-of-packages '(consult embark vertico))

  ;; Then I'd instruct package-vc.el to ensure that these packages are
  ;; installed, i.e. install missing packages with local repo
  ;; checkouts:
  (package-vc-...-ensure)

But so far, I was only able to approximate this ideal with several
caveats in my init.el, as follows. First, I load relevant modules.

  (require 'package)
  (require 'package-vc)

Here I maintain a list of packages that I want to be installed.

  (setopt package-vc-selected-packages
    '( (consult
         :url "https://github.com/minad/consult.git")
       (embark
         :url "https://github.com/oantolin/embark.git"
         :ignored-files ("embark-consult.el" "avy-embark-collect.el"))
       (vertico
         :url "https://github.com/minad/vertico.git")
       (vertico-buffer
         :url "https://github.com/minad/vertico.git"
         :lisp-dir "extensions"
         :main-file "vertico-buffer.el")))

As you can see, one caveat is that I need to specify :url, :lisp-dir and
similar values manually. Can I gather these somehow automatically
instead?

Another caveat is that some repositories, like Vertico's, contain
multiple packages, like vertico-buffer. Can I avoid having multiple
local checkouts of the same repository (while still keeping all
(sub)packages marked as installed)?

Now, I'd like to ensure that these packages are installed. But if I put
(package-vc-install-selected-packages) in my init.el, Emacs
interactively asks me "Overwrite previous checkout for package
`consult'? (yes or no)" during startup. That's why I currently evaluate
that s-expression manually whenever I change the value of
package-vc-selected-packages. Is there a way to to make
package-vc-install-selected-packages (1.) not ask anything
interactively; and (2.) simply not overwrite already installed packages;
and (3.) still install packages that not yet installed?

After having ensured that packages are installed, the following
initializes load-path:

  (package-initialize)

There's another problem though: When I put a package foo in
package-vc-selected-packages, and foo depends on another external
package bar, and I have not put bar in -selected-packages, and I call
package-vc-install-selected-packages, then Emacs will try to install to
install bar from a package-archive without any local repository checkout
but rather in the usual package.el way. That's why I also have this
setting in my init.el:

  (setopt package-archives nil)

This forces package.el to fail when I forgot to list a dependency in
-selected-packages variable. As an unfortunate consequence, I also end
up doing dependency management manually. But I'd love to have
dependencies vc-installed too! Thus this question arises: Is there a way
to tell package-vc-install-selected-packages to vc-install the selected
packages *including* their dependencies?



             reply	other threads:[~2024-04-15  9:51 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-15  9:51 Mekeor Melire [this message]
2024-04-15 12:29 ` Use package-vc.el for declarative, source-based package management? Stefan Monnier via Users list for the GNU Emacs text editor
2024-04-15 19:45 ` Philip Kaludercic

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87plurnecb.fsf@posteo.de \
    --to=mekeor@posteo.de \
    --cc=help-gnu-emacs@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).