Фактический акт загрузки пакетов в require
выполняется серией функций , хранящихся в таблице package.searchers
(на языке Lua 5.2+. 5.1 использует package.loaders
, но это та же идея).Все, что вам нужно сделать, это добавить функцию поиска, которая может обрабатывать «пакеты», чьи имена являются URL-адресами:
local http = require("socket.http")
local function http_loader(module_uri)
--I don't know what this function does, so I assume it returns the actual text of the file.
--If not, feel free to insert whatever the `socket` module needs to retrieve the text at the URI.
local module_text = http.request(module_uri)
--Always do error checking.
if --[[did the request succeed?]] then
return loadstring(module_text)
else
return "could not find HTTP module name " .. module_uri
end
end
table.insert(package.searchers, http_loader)
При этом вы должны иметь возможность непосредственно выполнять require "http://127.0.0.1:800/myfile.lua"
.
Если вместо этого у вас есть определенные модули в сети, которые вы хотите предварительно загрузить, вы можете использовать таблицу packages.preload
.Например, если вы хотите предварительно загрузить файл Lua в http://127.0.0.1:800/myfile.lua
, используя имя модуля «remote», вы можете сделать это:
local http = require("socket.http")
local function http_preload(module_uri, module_name)
local module_text = http.request(module_uri) --Again, assuming this is the text.
--Always do error checking.
if --[[did the request succeed?]] then
package.preload[module_name] = loadstring(module_text)
return true
else
return nil, "could not find HTTP module name " .. module_uri
end
end
assert(http_preload("http://127.0.0.1:800/myfile.lua", "remote"))
require "remote" --Includes the loaded file.
Теперь, ни один из этих методов волшебным образом не разрешит любые модули из myfile.lua
для доступа к сетевым ресурсам.Если вы используете первый метод, а для myfile.lua
требуются некоторые локальные ресурсы (например, на сервере), то он должен будет обращаться к ним через HTTP, как если бы он был на клиенте (потому что он был загружен с него).).
Если вы используете второй метод, вам потребуется http_preload
модулей в таком порядке, чтобы ни один модуль не пытался загрузить ресурс, который еще не был предварительно загружен.