package - module support (standard library)¶
OVERVIEW¶
The package library provides basic facilities for loading and building
modules in Lua. It exports two of its functions directly in the
global environment: require()
and module()
.
Everything else is exported in a table package
.
INTERFACE¶
- module()¶
module (name [, ...])
Creates a module. If there is a table in package.loaded[name]
,
this table is the module. Otherwise, if there is a global table t
with the given name, this table is the module. Otherwise creates a
new table t
and sets it as the value of the global name
and the
value of package.loaded[name]
. This function also initializes
t._NAME
with the given name, t._M
with the module (t
itself),
and t._PACKAGE
with the package name (the full module name minus
last component; see below). Finally, module()
sets t
as the new
environment of the current function and the new value of
package.loaded[name]
, so that require()
returns t
.
If name
is a compound name (that is, one with components separated
by dots), module()
creates (or reuses, if they already exist) tables
for each component. For instance, if name
is a.b.c
, then
module()
stores the module table in field c
of field b
of
global a
.
This function can receive optional options after the module name, where each option is a function to be applied over the module.
- require()¶
require (modname)
Loads the given module. The function starts by looking into the
package.loaded
table to determine whether modname
is already
loaded. If it is, then require
returns the value stored at
package.loaded[modname]
. Otherwise, it tries to find a loader
for the module.
To find a loader, require
is guided by the package.loaders
array. By changing this array, we can change how require
looks for
a module. The following explanation is based on the default
configuration for package.loaders
.
First require
queries package.preload[modname]
. If it has a
value, this value (which should be a function) is the loader.
Otherwise require
searches for a Lua loader using the path stored
in package.path
. If that also fails, it searches for a C loader
using the path stored in package.cpath
. If that also fails, it
tries an all-in-one loader (see package.loaders
).
Once a loader is found, require
calls the loader with a single
argument, modname
. If the loader returns any value, require
assigns the returned value to package.loaded[modname]
. If the
loader returns no value and has not assigned any value to
package.loaded[modname]
, then require
assigns true
to this entry. In any case, require
returns the
final value of package.loaded[modname]
.
If there is any error loading or running the module, or if it cannot
find any loader for the module, then require
signals an error.
- package.cpath¶
package.cpath
The path used by require
to search for a C loader.
Lua initializes the C path package.cpath
in the same way it
initializes the Lua path package.path
, using the environment
variable LUA_CPATH
or a default path defined in
luaconf.h
.
- package.loaded¶
package.loaded
A table used by require()
to control which modules are already
loaded. When you require a module modname
and
package.loaded[modname]
is not false, require()
simply returns the
value stored there.
- package.loaders¶
A table used by require()
to control how to load modules.
Each entry in this table is a searcher function. When looking for
a module, require()
calls each of these searchers in ascending order,
with the module name (the argument given to require()
) as its sole
parameter. The function can return another function (the module
loader) or a string explaining why it did not find that module (or
nil
if it has nothing to say). Lua initializes this table with
four functions.
The first searcher simply looks for a loader in the
package.preload
table.
The second searcher looks for a loader as a Lua library, using the
path stored at package.path
. A path is a
sequence of templates separated by semicolons. For each
template, the searcher will change each interrogation mark in the
template by filename
, which is the module name with each
dot replaced by a “directory separator” (such as “/
” in
Unix); then it will try to open the resulting file name. So, for
instance, if the Lua path is the string
"./?.lua;./?.lc;/usr/local/?/init.lua"
the search for a Lua file for module foo
will try to open
the files ./foo.lua
, ./foo.lc
, and /usr/local/foo/init.lua
,
in that order.
The third searcher looks for a loader as a C library, using the
path given by the variable package.cpath
. For
instance, if the C path is the string
"./?.so;./?.dll;/usr/local/?/init.so"
the searcher for module foo
will try to open the files ./foo.so
,
./foo.dll
, and /usr/local/foo/init.so
, in that order. Once it
finds a C library, this searcher first uses a dynamic link facility to
link the application with the library. Then it tries to find a
C function inside the library to be used as the loader. The name
of this C function is the string luaopen_
concatenated with a
copy of the module name where each dot is replaced by an underscore.
Moreover, if the module name has a hyphen, its prefix up to (and
including) the first hyphen is removed. For instance, if the module
name is a.v1-b.c
, the function name will be luaopen_b_c
.
The fourth searcher tries an all-in-one loader. It searches
the C path for a library for the root name of the given module. For
instance, when requiring a.b.c
, it will search for a C library for
a
. If found, it looks into it for an open function for the
submodule; in our example, that would be luaopen_a_b_c
. With this
facility, a package can pack several C submodules into one single
library, with each submodule keeping its original open function.
- package.loadlib()¶
package.loadlib (libname, funcname)
Dynamically links the host program with the C library libname
.
Inside this library, looks for a function funcname
and returns this
function as a C function. (So, funcname
must follow the
protocol (see lua_CFunction
).
This is a low-level function. It completely bypasses the package and
module system. Unlike require()
, it does not perform any path
searching and does not automatically adds extensions.
libname
must be the complete file name of the C library, including
if necessary a path and extension. funcname
must be the exact name
exported by the C library (which may depend on the C compiler and
linker used).
This function is not supported by ANSI C. As such, it is only
available on some platforms (Windows, Linux, Mac OS X, Solaris, BSD,
plus other Unix systems that support the dlfcn
standard).
- package.path¶
package.path
The path used by require()
to search for a Lua loader.
At start-up, Lua initializes this variable with the value of the
environment variable LUA_PATH
or with a default path defined in
luaconf.h
, if the environment variable is not defined. Any “;;
”
in the value of the environment variable is replaced by the default
path.
A path is a sequence of templates separated by semicolons. For
each template, require()
will change each interrogation mark in the
template by filename
, which is modname
with each dot replaced by
a “directory separator” (such as “/
” in Unix); then it will try to
load the resulting file name. So, for instance, if the Lua path is
"./?.lua;./?.lc;/usr/local/?/init.lua"
the search for a Lua loader for module foo
will try to load the
files ./foo.lua
, ./foo.lc
, and /usr/local/foo/init.lua
, in
that order.
- package.preload¶
package.preload
A table to store loaders for specific modules (see require()
).
- package.seeall¶
package.seeall (module)
Sets a metatable for module
with its __index
field referring to
the global environment, so that this module inherits values from the
global environment. To be used as an option to function module
.
This document is from Lua version 5.1.5. Copyright (c) 2006-2012 Lua.org, PUC-Rio. Freely available under the terms of the Lua license.