Modules (package)¶
Original document, see: http://www.lua.org/manual/5.1/manual.html
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
.
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 tablet
with the given name, this table is the module. Otherwise creates a new tablet
and sets it as the value of the globalname
and the value ofpackage.loaded[name]
. This function also initializest._NAME
with the given name,t._M
with the module (t
itself), andt._PACKAGE
with the package name (the full module name minus last component; see below). Finally,module
setst
as the new environment of the current function and the new value ofpackage.loaded[name]
, so that require returnst
.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, ifname
isa.b.c
, thenmodule
stores the module table in fieldc
of fieldb
of globala
.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, thenrequire
returns the value stored atpackage.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 howrequire
looks for a module. The following explanation is based on the default configuration for package.loaders.First
require
queriespackage.preload[modname]
. If it has a value, this value (which should be a function) is the loader. Otherwiserequire
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 topackage.loaded[modname]
. If the loader returns no value and has not assigned any value topackage.loaded[modname]
, thenrequire
assigns true to this entry. In any case,require
returns the final value ofpackage.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 inluaconf.h
.
package.loaded¶
package.loaders¶
- 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 isa.v1-b.c
, the function name will beluaopen_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 fora
. If found, it looks into it for an open function for the submodule; in our example, that would beluaopen_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 functionfuncname
and returns this function as a C function. (So,funcname
must follow the protocol.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 inluaconf.h
, if the environment variable is not defined. Any “;;
” in the value of the environment variable is replaced by the default path.
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.
id-1096722