Provided by: elvish_0.13+ds1-2ubuntu0.1_amd64 bug

Introduction

       The Elvish Package Manager (epm) is a module bundled with Elvish for managing third-party packages.

       In Elvish terminology, a module is a .elv file that can be imported with the use command, while a package
       is a collection of modules that are usually kept in the same repository as one coherent project  and  may
       have  interdependencies.  The Elvish language itself only deals with modules; the concept of package is a
       matter of how to organize modules.

       Like the go command, Elvish does not have a central registry of packages.  A package is simply identified
       by  the  URL  of its code repository, e.g.  github.com/elves/sample-pkg (https://github.com/elves/sample-
       pkg).  To install the package, one simply uses the following:

              use epm
              epm:install github.com/elves/sample-pkg

       epm knows out-of-the-box how to manage packages hosted in GitHub, BitBucket and GitLab, and requires  the
       git  command  to  be  available.   It  can also copy files via git or rsync from arbitrary locations (see
       Custom package domains for details).

       Once installed, modules in this package can be imported with use  github.com/elves/sample-pkg/....   This
       package has a module named sample-mod containing a function sample-fn, and can be used like this:

              ~> use github.com/elves/sample-pkg/sample-mod
              ~> sample-mod:sample-fn
              This is a sample function in a sample module in a sample package

       The  next  section  describes  functions  in  the  epm module, using the same notation as the doc for the
       builtin module (builtin.html#usage-notation).

Functions

   install
              epm:install &silent-if-installed=$false $pkg...

       Install the named packages.  By default, if a package is already installed,  a  message  will  be  shown.
       This  can  be  disabled  by  passing  &silent-if-installed=$true,  so that already-installed packages are
       silently ignored.

   installed
              epm:installed

       Return an array with all installed packages.  epm:list can be used as an alias for epm:installed.

   is-installed
              epm:is-installed $pkg

       Returns a boolean value indicating whether the given package is installed.

   metadata
              epm:metadata $pkg

       Returns a hash containing the metadata for the given  package.   Metadata  for  a  package  includes  the
       following base attributes:

       • name: name of the package

       • installed: a boolean indicating whether the package is currently installed

       • method: method by which it was installed (git or rsync)

       • src: source URL of the package

       • dst:  where  the  package  is  (or  would  be) installed.  Note that this attribute is returned even if
         installed is $false.

       Additionally, packages can define arbitrary metadata attributes in a file called metadata.json  in  their
       top directory.  The following attributes are recommended:

       • description: a human-readable description of the package

       • maintainers: an array containing the package maintainers, in Name <email> format.

       • homepage: URL of the homepage for the package, if it has one.

   query
              epm:query $pkg

       Pretty print the available metadata of the given package.

   uninstall
              epm:uninstall $pkg...

       Uninstall named packages.

   upgrade
              epm:upgrade $pkg...

       Upgrade named packages.  If no package name is given, upgrade all installed packages.

Custom package domains

       Package  names in epm have the following structure: domain/path.  The domain is usually the hostname from
       where the package is to be fetched, such as github.com.   The  path  can  have  one  or  more  components
       separated  by  slashes.  Usually, the full name of the package corresponds with the URL from where it can
       be   fetched.    For    example,    the    package    hosted    at    https://github.com/elves/sample-pkg
       (https://github.com/elves/sample-pkg) is identified as github.com/elves/sample-pkg.

       Packages  are  stored  under  ~/.elvish/lib/ in a path identical to their name.  For example, the package
       mentioned above is stored at ~/.elvish/lib/github.com/elves/sample-pkg.

       Each domain must be configured with the following information:

       • The method to use to fetch packages from the domain.  The two supported methods are git and rsync.

       • The number of directory levels under the domain  directory  in  which  the  packages  are  found.   For
         example,  for  github.com  the  number  of  levels  is  2,  since  package  paths have two levels (e.g.
         elves/sample-pkg).  All packages from a given domain have the same number of levels.

       • Depending on the method, other attributes are needed:

         • git needs a protocol attribute,  which  can  be  https  or  http,  and  determines  how  the  URL  is
           constructed.

         • rsync  needs  a  location  attribute,  which must be a valid source directory recognized by the rsync
           command.

       epm includes default domain configurations for github.com, gitlab.com  and  bitbucket.org.   These  three
       domains share the same configuration:

              {
                  "method": "git",
                  "protocol": "https",
                  "levels": "2"
              }

       You can define your own domain by creating a file named epm-domain.cfg in the appropriate directory under
       ~/.elvish/lib/.  For example, if you want to define an elvish-dev domain  which  installs  packages  from
       your local ~/dev/elvish/ directory, you must create the file ~/.elvish/lib/elvish-dev/epm-domain.cfg with
       the following JSON content:

              {
                  "method": "rsync",
                  "location": "~/dev/elvish",
                  "levels": "1"
              }

       You can then install any directory under ~/dev/elvish/  as  a  package.   For  example,  if  you  have  a
       directory     ~/dev/elvish/utilities/,     the     following    command    will    install    it    under
       ~/.elvish/lib/elvish-dev/utilities:

              epm:install elvish-dev/utilities

       When you make any changes to your  source  directory,  epm:upgrade  will  synchronize  those  changes  to
       ~/.elvish/lib.