Skip to content

redguardtoo/elpa-mirror

master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
 
 
 
 
 
 
 
 
 
 

elpa-mirror

https://github.com/redguardtoo/elpa-mirror/actions/workflows/test.yml/badge.svg http://melpa.org/packages/elpa-mirror-badge.svg http://stable.melpa.org/packages/elpa-mirror-badge.svg

Create local Emacs package repository from installed packages so package upgrade never breaks.

Why

  • Emacs Lisp compile file (*.elc) is not portable for different versions of Emacs. So emacs.d copied from higher version of Emacs might crash in lower version of Emacs
  • Package installation is fast. 15 seconds to install 115 packages
  • The repository could be hosted on USB/Dropbox/GitHub. So you can install packages behind corp firewall
  • Tested with Emacs 25, 26, 27, 28 on OSX/Cygwin/Windows10/Linux

Install

CLI program tar is required. It’s already installed on Windows10/Linux/macOS.

  • Download elpa-mirror.el to somewhere (say ~/.emacs.d/site-lisp/elpa-mirror/)
  • Add below code into your ~/.emacs,
(add-to-list 'load-path "~/.emacs.d/site-lisp/elpa-mirror")
(require 'elpa-mirror)

Usage

M-x elpamr-create-mirror-for-installed to create local repository.

To update existing local repository, run M-x elpamr-create-mirror-for-installed again.

BTW, you can run elpa-mirror.el as a independent script,

mkdir -p ~/myelpa && emacs --batch -l ~/.emacs.d/init.el -l ~/any-directory-you-prefer/elpa-mirror.el --eval='(setq elpamr-default-output-directory "~/myelpa")' --eval='(elpamr-create-mirror-for-installed)'

To use the local repository ~/myelpa/, insert below code into your ~/.emacs,

;; myelpa is the ONLY repository now, dont forget trailing slash in the directory
(setq package-archives '(("myelpa" . "~/myelpa/")))

Repository on Dropbox

Insert below code into ~/.emacs:

;; add-to-list will not override default elpa.
;; So now you have two repositories.
;; One is GNU elpa. Another is myelpa
(add-to-list 'package-archives
             '("myelpa" . "https://dl.dropboxusercontent.com/u/858862/myelpa/"))

Repository on GitHub

My repository is https://github.com/redguardtoo/myelpa.

Insert below code into .emacs:

;; add-to-list will not override default elpa.
;; So now you have two repositories.
;; One is GNU elpa. Another is myelpa
(add-to-list 'package-archives
             '("myelpa" . "https://raw.githubusercontent.com/redguardtoo/myelpa/master/"))

Tips

Exclude packages

See elpamr-exclude-packages.

Exclude files/directories in package directory

See elpamr-tar-command-exclude-patterns.

elpamr-exclude-patterns-filter-function lets users define a filter function to exclude files and directories per package. The function returns the result to replace elpamr-tar-command-exclude-patterns.

Below setup adds directory “bin/” into package “vagrant-tramp”.

(setq elpamr-exclude-patterns-filter-function
      (lambda (package-dir)
        (let ((patterns elpamr-tar-command-exclude-patterns))
          (when (string-match "vagrant-tramp" package-dir)
            (setq patterns (remove "*/bin" patterns)))
          patterns)))

Change output directory,

(setq elpamr-default-output-directory "~/myelpa")

Report a Bug

Reproduce the bug, report it at https://github.com/redguardtoo/elpa-mirror, and attach the contents of the *elpa-mirror log* buffer.

About

Create local emacs package repository. 15 seconds to install 115 packages.

Resources

Stars

Watchers

Forks

Packages

No packages published