Required Packages (Emacs Reboot #12)

I’m keeping this configuration synchronized between two machines. For most changes simply pushing the change to my Emacs Reboot GitHub repo and pulling it on the other machine is all I need. But when the customizations depend on a certain package being installed, the configuration breaks on the other machine until I manually install the package.

Today I add a customization which ensures all needed packages are installed at the time Emacs starts up:

(setq package-archives 
      '(("gnu" . "http://elpa.gnu.org/packages/") 
        ("marmalade" . "http://marmalade-repo.org/packages/") 
        ("Tromey" . "http://tromey.com/elpa/")))
(package-initialize)
(setq abg-required-packages 
      (list 'xml-rpc 'magit 'gh))
(dolist (package abg-required-packages)
  (when (not (package-installed-p package))
    (package-refresh-contents)
    (package-install package)))

This code is pretty straightforward: first, define the list of package archives to search, and make sure the package system is initialized. Then define a list of needed packages, and iterate over the list, installing the ones which are missing from this Emacs.

This post is part of the Emacs Reboot series. Check out the rest of the series for more Emacs goodness. You can also subscribe to a podcast feed of just the videos.

This entry was posted in Emacs Reboot and tagged . Bookmark the permalink.
  • Anonymous

    I have:

        (defun rwd-require-package (name)
          (or (package-installed-p name) (package-install name)))

    Which allows me to put the package requirement near its use rather than have a centralized list of stuff that may fall out of sync with my needs.

    • http://avdi.org Avdi Grimm

      Makes sense. I might switch over to that.

  • http://natanyellin.com Natan Yellin

    I highly recommend you try el-get, the meta package manager for emacs. You can install packages from ELPA, apt, vcs repositories (git, svn, bzr), and even EmacsWiki.

    • http://avdi.org Avdi Grimm

      Thanks, it’s on my list of things to look into.

  • http://yoo2080.wordpress.com/ Jisang Yoo

    (package-refresh-contents) probably can be placed outside of the loop.

    (package-refresh-contents)(dolist (package abg-required-packages)  (when (not (package-installed-p package))    (package-install package)))