I tried to have some Emacs packages from MELPA installed system-wide, following suggestions from this question. I want to have these packages installed under /usr/local/share/emacs/site-lisp/elpa, so as root user, I've created minimal ~/.emacs as follows:

(add-to-list 'package-archives
             '("melpa-stable" . "https://stable.melpa.org/packages/") t)
(setq package-user-dir "/usr/local/share/emacs/site-lisp/elpa")

Then, I started Emacs as root, and installed packages as usual, everything seemed fine. Then, I've added following at the beggining of ~/.emacs file of an ordinary user:

(push "/usr/local/share/emacs/site-lisp/elpa" package-directory-list)

However, this doesn't work, in the sense that neither root user nor ordinary user could use installed packages. For example if I run following command in the scratch buffer of Emacs run as root user (I installed use-package among other packages):

(require 'use-package)

following error is reported:

Debugger entered--Lisp error: (file-missing "Cannot open load file" "No such file or directory" "use-package")
  eval((require 'use-package) nil)
  funcall-interactively(eval-last-sexp nil)
  call-interactively(eval-last-sexp nil nil)

On the other side, if last line in the root user ~/.emacs file changed to:

(setq package-user-dir "/usr/share/emacs/site-lisp/elpa")

and also the last line in the ordinary user ~/.emacs file deleted, then everything works fine and both users could use installed packages (note that directory /usr/share/emacs/site-lisp/elpa is in package-directory-list by default).

Any hint what could be the problem here? It's not big deal, but I'd just like to keep packages installed this way under /usr/local, since as far as I remember it, according to FHS this would be the right place for packages installed this way.

  • You can use site-start.el or default.el to configure package directories for users. gnu.org/software/emacs/manual/html_node/emacs/Init-File.html As for your problem with /usr/local, I'd check the value of load-path. – DoMiNeLa10 Nov 9 '18 at 19:48
  • Thanks for your reply. Indeed, if I just add (push "/usr/local/share/emacs/site-lisp" load-path) before (package-initialize) in the user ~/.emacs file, everything works fine with packages installed under /usr/local. Also, the line (push "/usr/local/share/emacs/site-lisp/elpa" package-directory-list) seems unneeded any more, probably it gets automatically updated at (package-initialize) from load-path variable. – Crni Nov 9 '18 at 20:33

I believe the problem is here:

(push "/usr/local/share/emacs/site-lisp/elpa" package-directory-list)

You add to package-directory-list too late, because package-initialize has already looked for packages to activate and won't notice that you later add more things to the list of directories. You can do the following instead:

(require 'package)
(push "/usr/local/share/emacs/site-lisp/elpa" package-directory-list)
  • Thanks, indeed that solves the problem too. – Crni Nov 10 '18 at 8:46

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.