Lua socket.http нормально загружается из примера сценария, но не загружается со стороннего хоста

Я работаю над сценарием Lua, который будет размещен в сторонней программе (некоторые.exe, которые будут вызывать определенную функцию в моем сценарии). Для реализации нужной мне функциональности (позвоните в веб-сервис, чтобы получить определенную информацию), я хочу использовать socket.http.request,

Сначала я создал пример сценария для вызова, который хотел сделать:

local io = require("io")
local http = require("socket.http")
local ltn12 = require("ltn12")

local data =  "some data")
local response = {}
socket.http.request({
    method = "POST",
    url = "http://localhost:8080/someServce/rest/commands/someCommand",
    headers = {
            ["Content-Type"] = "application/x-www-form-urlencoded",
            ["Content-Length"] = string.len(data)
        },
    source = ltn12.source.string(data),
    sink = ltn12.sink.table(response)
    })
print(table.concat(response))
print("Done")

Это отлично работает. Я получаю ответ, который ожидаю. Теперь, когда я пытаюсь сделать это со стороннего хоста, я сначала получил ошибку:

 module 'socket.http' not found:
    no field package.preload['socket.http']
    no file '.\socket\http.lua'
    no file 'D:\SomeFolder\lua\socket\http.lua'
    no file 'D:\SomeFolder\lua\socket\http\init.lua'
    no file 'D:\SomeFolder\socket\http.lua'
    no file 'D:\SomeFolder\socket\http\init.lua'
    no file 'C:\Program Files (x86)\Lua\5.1\lua\socket\http.luac'
    no file '.\socket\http.dll'
    no file 'D:\SomeFolder\socket\http.dll'
    no file 'D:\SomeFolder\loadall.dll'
    no file '.\socket.dll'
    no file 'D:\SomeFolder\socket.dll'
    no file 'D:\SomeFolder\loadall.dll'

Я попытался скопировать папку сокетов из папки LUA в папку, из которой выполняется хост (D:\SomeFolder). Затем он находит модуль, но не может загрузить его с другой ошибкой:

loop or previous error loading module 'socket.http'

Я также попытался переместить оператор require за пределы функции и сделать его глобальным. Это дает мне еще одну ошибку:

 module 'socket.core' not found:
    no field package.preload['socket.core']
    no file '.\socket\core.lua'
    no file 'D:\SomeFolder\lua\socket\core.lua'
    no file 'D:\SomeFolder\lua\socket\core\init.lua'
    no file 'D:\SomeFolder\socket\core.lua'
    no file 'D:\SomeFolder\socket\core\init.lua'
    no file 'C:\Program Files (x86)\Lua\5.1\lua\socket\core.luac'
    no file 'C:\Program Files (x86)\Lua\5.1\lua\socket\core.lua'
    no file '.\socket\core.dll'
    no file 'D:\SomeFolder\socket\core.dll'
    no file 'D:\SomeFolder\loadall.dll'
    no file '.\socket.dll'
    no file 'D:\SomeFolder\socket.dll'
    no file 'D:\SomeFolder\loadall.dll'

Затем я попытался скопировать core.dll из сокета в папку D: \ SomeFolder, и это дало мне еще одну ошибку:

error loading module 'socket.core' from file '.\socket\core.dll':
    %1 is not a valid Win32 application.

Теперь я застрял. Я думаю, что я, должно быть, делаю что-то совершенно не так, но не могу найти правильного описания того, как решить подобные проблемы. Может кто-нибудь мне помочь?

2 ответа

Решение

Как выясняется, проблема заключается в том, какой путь будет искать Луа. Вместе с третьей стороной мы обнаружили, что если мы поместим набор библиотек в D:\SomeFolder\ теперь все работает. Так, например, теперь есть socket.lua в D:\SomeFolder\ и там есть розетка и пантомима.

Практическое правило заключается в том, что расположение файла lua5.1.dll, связанного с приложением, приводит к расположению любых модулей, которые вы хотите загрузить.

Вы, вероятно, должны иметь следующую структуру папок (относительно D:\SomeFolder папка):

socket.lua
socket/core.dll
socket/http.lua
socket/url.lua
socket/<any other file from socket folder required by http.lua>

Я только что проверил эту конфигурацию, и она работает для меня.

Цикл или предыдущая ошибка загрузки модуля "socket.http"

Обычно это вызвано загрузкой socket.http от socket/http.lua сам файл.

Другие вопросы по тегам