Lua 未正确设置package.path

Lua 未正确设置package.path,lua,shared-libraries,Lua,Shared Libraries,我遇到的情况是,根据我定义package.path的位置,我的代码会失败。我不明白为什么 我有以下文件结构: /usr/share/zaf/mytestapp/main.lua /usr/share/zaf/mytestapp/lib/user.lua /usr/share/zaf/mytestapp/lib/admin_user.lua 有效的代码 在main中,我有以下代码: module (..., package.seeall) package.path = package.path

我遇到的情况是,根据我定义package.path的位置,我的代码会失败。我不明白为什么

我有以下文件结构:

/usr/share/zaf/mytestapp/main.lua
/usr/share/zaf/mytestapp/lib/user.lua
/usr/share/zaf/mytestapp/lib/admin_user.lua
有效的代码

在main中,我有以下代码:

module (..., package.seeall)
package.path = package.path .. ';/usr/share/zaf/mytestapp/?.lua'
local user = require "lib.user"

list_devices = function(user_id, enduser, start_record, record_count)
   local devices = {}
   local success

   local res, err = pcall(function()   
        if enduser then         
            success, devices  = user:getDevices(user_id)   
        end
    end) --end pcall

   return devices
end
这个代码可以工作。。。系统能够找到user.lua并返回设备列表

不起作用的代码

我想更改代码,使其仅在我知道它是什么类型的用户之后加载库。注意我是如何将实例化用户对象的代码的位置移到“if”语句中的,但我将package.path行保留在它所在的位置

module (..., package.seeall)
package.path = package.path .. ';/usr/share/zaf/mytestapp/?.lua'

list_devices = function(user_id, enduser, start_record, record_count)
   local devices = {}
   local success

   local res, err = pcall(function()   
        if enduser then         
            local user = require "lib.user" 
            success, devices  = user:getDevices(user_id)   
        else
            --admin
            local admin_user = require 'lib.admin'  
            admin_user:get_devices()
        end
    end) --end pcall
   return devices
end
此代码失败,因为它再也找不到lib.user模块。。。我不明白为什么。我还在学习lua,所以如果这是一个真正的101问题,请原谅我。 如果我将package.path行移动到If语句内部,它将工作。。。像这样:

    if enduser then         
            package.path = package.path .. ';/usr/share/zaf/mytestapp/?.lua'
        local user = require "lib.user" 
        success, devices  = user:getDevices(user_id)   
    else
        --admin
        local admin_user = require 'lib.admin'  
        success, devices = admin_user:get_devices()
    end
但我不想多次定义package.path

如有任何建议,将不胜感激

谢谢

编辑1

我想我知道发生了什么。。。但我不知道为什么或如何修复它。如果我在文件顶部设置package.path定义,当代码进入list_devices()方法时,package.path将重置回默认值。我通过添加一条调试语句来测试这一点,该语句将package.path的内容转储到失败代码的if语句中。它不再有我附加的路径,即“/usr/share/zaf/mytestapp/?.lua”


这就解释了为什么我不能实例化这个对象。既然我似乎没有做什么明显的错误,(我不确定在公元前我是lua的新手之前)我要去另一棵树上树皮。我正在使用一个框架。也许它有一个bug。。。现在就开始测试。

显示的代码没有问题。问题的根源在于未显示的代码,再加上使用了
pcall
,它将错误捕获为返回代码,这样,如果您没有采取适当的预防措施,即使匿名函数出错,您的脚本仍可以继续。这可能很有用,但也很危险(如果没有适当的检查)

也就是说,我运行以下
main.lua

package.path = package.path .. ";testreqdir/?.lua"
list_devices = function(end_user)
    function test()
        if end_user then
            print('requiring')
            local user = require "testlib.user"
            user:test()   
        end
    end
    local status, errMsg = pcall(test)
end
list_devices(true)
在文件夹
testreqdir/testlib
中,
user.lua
如下所示:

print('user loaded')
return {
    test = function() 
        print('hello', arg[0])
    end
}
这将产生以下输出:

C:\Users\me>lua testrequire.lua
requiring
user loaded
hello   testrequire.lua
如果我注释掉
package.path
行,因此找不到
user.lua
模块,则输出如下,并且没有迹象表明调用
require
时由于
pcall
而发生错误:

C:\Users\me>lua testrequire.lua
requiring

最有可能的情况是,当您需要从函数内部调用
user.lua时,会发生错误,但会被
pcall
捕获并作为代码返回。因此,现在请删除
pcall
,以便进行回溯。此外,如果坚持使用
pcall
,则应添加代码以检查返回代码是否存在错误,并采取适当的措施。您可能对
xpcall
感兴趣,它允许您设置错误处理函数;这可能会导致代码更干净

这很奇怪。你能试着举一个小的例子吗?如果去掉外部函数或pcall,会发生什么?另外,您使用的是什么Lua版本?您应该使用
package.config:sub(1,1)
而不是
,可在Lua上配置。另外,
module(…,package.seeall)
从5.1开始就被弃用了,我记得。@Kamiccolo关于使用package.config的评论,你能详细介绍一下吗?谢谢。@missingno如果我去掉了pcall,现在不起作用的代码将失败,错误是找不到lib.user。。。这意味着文件顶部的package.path语句不起作用。我在运行Lua5.1。5@dot路径分隔符(在您的普通情况下是
some/path;some/other/path;one/more/path
)。但是它是可配置的,因此,您应该使用
package.config:sub(1,1)
返回的值。如果默认值被更改,你是对的。我本应该注意到那颗流星的。我现在已经删除了它,它肯定在抱怨它找不到库'lib.user',尽管我仍然在模块顶部定义了package.path…请查看我的postGood中的“编辑1”。我想你可以在框架和你的脚本中搜索所有出现的package.path。还没有找到确切的位置。。。但我已经证明,该框架正在破坏这条道路。我要把你的答案记下来。。。谢谢