Difference between revisions of "Package.el"

From WikEmacs
Jump to navigation Jump to search
(31 intermediate revisions by 16 users not shown)
Line 1: Line 1:
 +
{{Package
 +
|name=package.el
 +
|description=Package Manager
 +
|author=Tom Tromey
 +
|maintainer=[[FSF]]
 +
|source=http://repo.or.cz/w/emacs.git/blob_plain/HEAD:/lisp/emacs-lisp/package.el
 +
|in_emacs=24
 +
|Development status=active
 +
}}
 +
 +
package.el is the built-in package manager in Emacs 24.
 +
 
== Install package.el on Emacs 23 ==
 
== Install package.el on Emacs 23 ==
<tt>package.el</tt> is bundled with Emacs 24, but it’s not bound to Emacs 23. Before it became part of Emacs it was an external package, known as ELPA (I guess that stood for Emacs Lisp Package Manager or something similar). So even if you’re an Emacs 23 user you can copy the latest version of <tt>package.el</tt> from [http://repo.or.cz/w/emacs.git/blob_plain/1a0a666f941c99882093d7bd08ced15033bc3f0c:/lisp/emacs-lisp/package.el here] and enjoy it.  
+
<tt>package.el</tt> is bundled with Emacs 24, but it’s not bound to Emacs 24. Before it became part of Emacs it was an external package, known as package.el that was tied to repository called ELPA ('''E'''macs '''L'''isp '''P'''ackage '''A'''rchive). So even if you’re an Emacs 23 user you can copy the latest version of <tt>package.el</tt> from [http://repo.or.cz/w/emacs.git/blob_plain/1a0a666f941c99882093d7bd08ced15033bc3f0c:/lisp/emacs-lisp/package.el here] and enjoy it.
 
 
  
 
== Configuration ==
 
== Configuration ==
Line 10: Line 21:
 
</source>
 
</source>
  
== How it works ==
+
== Select Packages from the List ==
What <tt>package.el</tt> basically does is that it connects to a list of package repositories, retrieves the list of the packages there, presents it to you in a interactive fashion and lets you install the packages you like (of course you can also remove the once you don’t like). <tt>package.el</tt> understands the dependencies between packages and if one package requires others to run they will be installed automatically (which is really neat).
+
[[File:M-x package-list-packages.png|400px|thumb|right|M-x package-list-packages]]
 +
<tt>package.el</tt> connects to a list of package repositories, retrieves the list of the packages there, presents it to you in a interactive fashion and lets you install the packages you like (of course you can also remove the ones you don’t like). <tt>package.el</tt> understands the dependencies between packages and if one package requires others to run they will be installed automatically (which is really neat).
  
 
The magic starts with the command {{Command|package-list-packages}}. At this point you should see something in the lines of this.
 
The magic starts with the command {{Command|package-list-packages}}. At this point you should see something in the lines of this.
Line 18: Line 30:
  
 
Initially <tt>package.el</tt> didn’t provide the option to update a package, but that should be fixed in recent Emacs builds. According to this [http://lists.gnu.org/archive/html/emacs-devel/2011-09/msg00371.html thread] you can even update all of the installed packages by using the “U” key in the packages list view (I guess that a small “u” would update only one package). Unfortunately my build is lacking those capabilities so I cannot comment of their usability.
 
Initially <tt>package.el</tt> didn’t provide the option to update a package, but that should be fixed in recent Emacs builds. According to this [http://lists.gnu.org/archive/html/emacs-devel/2011-09/msg00371.html thread] you can even update all of the installed packages by using the “U” key in the packages list view (I guess that a small “u” would update only one package). Unfortunately my build is lacking those capabilities so I cannot comment of their usability.
 +
 +
'''How does Update work please?''' It would appear not to be U?
  
 
== How to add additional repository ==
 
== How to add additional repository ==
You’d probably notice that your list of available packages is not particularly long. That’s because the official Emacs 24 package repository has a strict licensing (and source code) requirements to include a package there. Luckily there are a number of community-maintained <tt>package.el</tt> repos around with much more relaxed requirements. Probably the most popular of them is [http://marmalade-repo.org/ Marmalade], created by [http://nex-3.com/ Nathan Weizenbaum] of Sass and Haml fame. You can include it in your <tt>package-archives</tt> list like this:
+
The list of available packages is short because the official Emacs 24 package repository has strict licensing (and source code) requirements to include a package there. Luckily there are a number of community-maintained <tt>package.el</tt> repos around with much more relaxed requirements. Probably the most popular of them is [http://marmalade-repo.org/ Marmalade], created by [http://nex-3.com/ Nathan Weizenbaum] of Sass and Haml fame. You can include it in your <tt>package-archives</tt> list like this:
 +
 
 +
<source lang="lisp">
 +
(add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/"))
 +
</source>
  
<pre class="cl">(add-to-list 'package-archives
 
            '(&quot;marmalade&quot; . &quot;http://marmalade-repo.org/packages/&quot;) t)</pre>
 
 
Marmalade provides a web based UI for package upload and search (both quite buggy unfortunately) and the ability to share the maintenance of a package between several people, who’ll be able to upload new version of the package. There’s also a Emacs Lisp Marmalade tool, that allows you to submit packages directly from Emacs.
 
Marmalade provides a web based UI for package upload and search (both quite buggy unfortunately) and the ability to share the maintenance of a package between several people, who’ll be able to upload new version of the package. There’s also a Emacs Lisp Marmalade tool, that allows you to submit packages directly from Emacs.
  
Line 29: Line 45:
 
Using the <tt>package.el</tt> UI is ok if you’re a casual Emacs user, but what if you have a custom Emacs configuration, stored under version control, that you’d like to instantly deploy on any OS/machine (like Emacs Prelude). Here in play comes <tt>package.el</tt>’s programmer interface. In [https://github.com/bbatsov/emacs-prelude Emacs Prelude] I use the following code to install a list of required packages automatically on Emacs startup (if necessary):
 
Using the <tt>package.el</tt> UI is ok if you’re a casual Emacs user, but what if you have a custom Emacs configuration, stored under version control, that you’d like to instantly deploy on any OS/machine (like Emacs Prelude). Here in play comes <tt>package.el</tt>’s programmer interface. In [https://github.com/bbatsov/emacs-prelude Emacs Prelude] I use the following code to install a list of required packages automatically on Emacs startup (if necessary):
  
<pre class="cl">(defvar prelude-packages
+
<source lang="lisp">
 +
;; Comment out if you've already loaded this package...
 +
(require 'cl)
 +
 
 +
(defvar my-packages
 
   '(ack-and-a-half auctex clojure-mode coffee-mode deft expand-region
 
   '(ack-and-a-half auctex clojure-mode coffee-mode deft expand-region
 
                   gist groovy-mode haml-mode haskell-mode inf-ruby
 
                   gist groovy-mode haml-mode haskell-mode inf-ruby
Line 35: Line 55:
 
                   sass-mode rainbow-mode scss-mode solarized-theme
 
                   sass-mode rainbow-mode scss-mode solarized-theme
 
                   volatile-highlights yaml-mode yari zenburn-theme)
 
                   volatile-highlights yaml-mode yari zenburn-theme)
   &quot;A list of packages to ensure are installed at launch.&quot;)
+
   "A list of packages to ensure are installed at launch.")
  
(defun prelude-packages-installed-p ()
+
(defun my-packages-installed-p ()
 
   (loop for p in prelude-packages
 
   (loop for p in prelude-packages
 
         when (not (package-installed-p p)) do (return nil)
 
         when (not (package-installed-p p)) do (return nil)
 
         finally (return t)))
 
         finally (return t)))
  
(unless (prelude-packages-installed-p)
+
(unless (my-packages-installed-p)
 
   ;; check for new packages (package versions)
 
   ;; check for new packages (package versions)
  (message &quot;%s&quot; &quot;Emacs Prelude is now refreshing its package database...&quot;)
 
 
   (package-refresh-contents)
 
   (package-refresh-contents)
  (message &quot;%s&quot; &quot; done.&quot;)
 
 
   ;; install the missing packages
 
   ;; install the missing packages
 
   (dolist (p prelude-packages)
 
   (dolist (p prelude-packages)
 
     (when (not (package-installed-p p))
 
     (when (not (package-installed-p p))
 
       (package-install p))))
 
       (package-install p))))
 +
</source>
  
(provide 'prelude-packages)
 
;;; prelude-packages.el ends here</pre>
 
 
This code check if all of the packages in the list are installed and if any of them are not installed if refreshes the local package database (in the case a required package for recently added to the remote repo) and installs them.
 
This code check if all of the packages in the list are installed and if any of them are not installed if refreshes the local package database (in the case a required package for recently added to the remote repo) and installs them.
  
Line 59: Line 76:
 
To be able to publish a package to Marmalade (or another repo) it should comform a standardized structure. A single-file package might look like this:
 
To be able to publish a package to Marmalade (or another repo) it should comform a standardized structure. A single-file package might look like this:
  
<pre>
+
<source lang="lisp">
 
;;; sass-mode.el --- Sass major mode
 
;;; sass-mode.el --- Sass major mode
  
Line 72: Line 89:
  
 
;;; sass-mode.el ends here
 
;;; sass-mode.el ends here
</pre>
+
</source>
  
 
A multi-file package should have an additional file named
 
A multi-file package should have an additional file named
 
`<name>-pkg.el` that should look like this:
 
`<name>-pkg.el` that should look like this:
  
<pre>
+
<source lang="lisp">
 
(define-package "sass-mode" "3.0.20"
 
(define-package "sass-mode" "3.0.20"
 
                 "Sass major mode"
 
                 "Sass major mode"
 
                 '((haml-mode "3.0.20")))
 
                 '((haml-mode "3.0.20")))
  
</pre>
+
</source>
  
 
== package.el Repositories ==
 
== package.el Repositories ==
  
* [http://marmalade-repo.org/packages/ Marmalade]
+
* [[ELPA]]
* [http://elpa.gnu.org/packages/ ELPA]
+
* [[MELPA]]
* [http://melpa.milkbox.net/ MELPA]
+
* [[Marmalade]]
  
 
== External links ==
 
== External links ==
  
[[Category:Package Manager]]
+
* [http://batsov.com/articles/2012/02/19/package-management-in-emacs-the-good-the-bad-and-the-ugly/ Package Management in Emacs]
 +
 
 +
[[Category:Package Manager]][[Category:Built-in Package]]

Revision as of 08:25, 10 December 2012

package.el
Description Package Manager
Author Tom Tromey
Maintainer FSF
Source http://repo.or.cz/w/emacs.git/blob_plain/HEAD:/lisp/emacs-lisp/package.el
Part of Emacs Since Emacs 24

package.el is the built-in package manager in Emacs 24.

Install package.el on Emacs 23

package.el is bundled with Emacs 24, but it’s not bound to Emacs 24. Before it became part of Emacs it was an external package, known as package.el that was tied to repository called ELPA (Emacs Lisp Package Archive). So even if you’re an Emacs 23 user you can copy the latest version of package.el from here and enjoy it.

Configuration

Put the following snippet of code near the beginning of your Emacs config, since you’ll definitely want packages installed via package.el to be initalized before you start tweaking them.

(require 'package)
(package-initialize)

Select Packages from the List

M-x package-list-packages

package.el connects to a list of package repositories, retrieves the list of the packages there, presents it to you in a interactive fashion and lets you install the packages you like (of course you can also remove the ones you don’t like). package.el understands the dependencies between packages and if one package requires others to run they will be installed automatically (which is really neat).

The magic starts with the command M-x package-list-packages. At this point you should see something in the lines of this.

You can navigate the list of packages, mark the ones you want to install with the “i” key or the ones you want removed with the “d” key and when you’re done you can press the “x” key to execute the scheduled actions.

Initially package.el didn’t provide the option to update a package, but that should be fixed in recent Emacs builds. According to this thread you can even update all of the installed packages by using the “U” key in the packages list view (I guess that a small “u” would update only one package). Unfortunately my build is lacking those capabilities so I cannot comment of their usability.

How does Update work please? It would appear not to be U?

How to add additional repository

The list of available packages is short because the official Emacs 24 package repository has strict licensing (and source code) requirements to include a package there. Luckily there are a number of community-maintained package.el repos around with much more relaxed requirements. Probably the most popular of them is Marmalade, created by Nathan Weizenbaum of Sass and Haml fame. You can include it in your package-archives list like this:

(add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/"))

Marmalade provides a web based UI for package upload and search (both quite buggy unfortunately) and the ability to share the maintenance of a package between several people, who’ll be able to upload new version of the package. There’s also a Emacs Lisp Marmalade tool, that allows you to submit packages directly from Emacs.

How to use it with a custom build

Using the package.el UI is ok if you’re a casual Emacs user, but what if you have a custom Emacs configuration, stored under version control, that you’d like to instantly deploy on any OS/machine (like Emacs Prelude). Here in play comes package.el’s programmer interface. In Emacs Prelude I use the following code to install a list of required packages automatically on Emacs startup (if necessary):

;; Comment out if you've already loaded this package...
(require 'cl)

(defvar my-packages
  '(ack-and-a-half auctex clojure-mode coffee-mode deft expand-region
                   gist groovy-mode haml-mode haskell-mode inf-ruby
                   magit magithub markdown-mode paredit projectile python
                   sass-mode rainbow-mode scss-mode solarized-theme
                   volatile-highlights yaml-mode yari zenburn-theme)
  "A list of packages to ensure are installed at launch.")

(defun my-packages-installed-p ()
  (loop for p in prelude-packages
        when (not (package-installed-p p)) do (return nil)
        finally (return t)))

(unless (my-packages-installed-p)
  ;; check for new packages (package versions)
  (package-refresh-contents)
  ;; install the missing packages
  (dolist (p prelude-packages)
    (when (not (package-installed-p p))
      (package-install p))))

This code check if all of the packages in the list are installed and if any of them are not installed if refreshes the local package database (in the case a required package for recently added to the remote repo) and installs them.

How to publish it to Marmalade

To be able to publish a package to Marmalade (or another repo) it should comform a standardized structure. A single-file package might look like this:

;;; sass-mode.el --- Sass major mode

;; Copyright 2007-2010 Nathan Weizenbaum

;; Author: Nathan Weizenbaum <nex342@gmail.com>
;; URL: http://github.com/nex3/sass-mode
;; Version: 3.0.20
;; Package-Requires: ((haml-mode "3.0.20"))

;; Code goes here

;;; sass-mode.el ends here

A multi-file package should have an additional file named `<name>-pkg.el` that should look like this:

(define-package "sass-mode" "3.0.20"
                "Sass major mode"
                '((haml-mode "3.0.20")))

package.el Repositories

External links