Packages has since it was introduced more than 5 years ago been an experimental feature. Use it at your own risk, we do not actively maintain and develop this feature. It might however be supported some day.
In spite of this packages work quite well, but there are some known issues in tools and other parts where packages don't work well.
Introduction
Packages are simply namespaces for modules. All old Erlang modules automatically belong to the top level ("empty-string") namespace, and do not need any changes.
The full name of a packaged module is written as e.g.
"
The code loader maps module names onto the file system directory
structure.
E.g., the module
A packaged module in a file "
-module(foo.bar.fred).
This can be compiled and loaded from the Erlang shell using
The Erlang search path works exactly as before,
except that the package segments will be appended to each
directory in the path in order to find the
file. E.g., assume the path is
Programming
Normally, if a call is made from one module to another, it is assumed that the called module belongs to the same package as the source module. The compiler automatically expands such calls. E.g., in:
-module(foo.bar.m1).
-export([f/1]).
f(X) -> m2:g(X).
-module(foo.bar.m1).
-export([f/1]).
f(X) -> fee.fie.foe.m2:g(X).
Because the called module is given with an explicit package name, no expansion is done in this case.
If a module from another package is used repeatedly in a module, an import declaration can make life easier:
-module(foo.bar.m1).
-export([f/1, g/1]).
-import(fee.fie.foe.m2).
f(X) -> m2:g(X).
g(X) -> m2:h(X).
will make the calls to
Old-style function imports work as normal (but full module names must be used); e.g.:
-import(fee.fie.foe.m2, [g/1, h/1]).
however, it is probably better to avoid this form of import altogether in new code, since it makes it hard to see what calls are really "remote".
If it is necessary to call a module in the top-level package
from within a
named package, the module name can be written either with an
initial period as
in e.g. "
-module(foo.bar.fred).
-export([f/1]).
-import(lists).
f(X) -> lists:reverse(X).
The dot-syntax for module names can be used in any expression. All segments must be constant atoms, and the result must be a well-formed package/module name. E.g.:
spawn(foo.bar.fred, f, [X])
is equivalent to
The Erlang Shell
The shell also automatically expands remote calls,
however currently no
expansions are made by default.
The user can change the behaviour by using the
1> import(foo.bar.m). ok 2> m:f().
will evaluate
In addition, the shell command
1> import_all(foo.bar).
will make
Note: The compiler does not have an "import all" directive, for the
reason that Erlang has no compile time type checking.
E.g. if the wrong search
path is used at compile time, a call