是否可以使导入依赖于我的Lua脚本而不是当前目录的位置?

时间:2012-07-30 00:40:01

标签: lua

如果我有两个脚本在同一目录中相互引用

A/
   foo.lua
   bar.lua

foo.lua

require "bar"

bar.lua

print "It worked"

然后从同一文件夹运行lua可执行文件

cd A; lua foo.lua

但是从另一个文件夹运行解释程序失败,并显示“找不到模块'栏”消息

cd A/..; lua A/foo.lua

有没有办法让我的相对导入不依赖于当前的工作目录?例如,在批处理文件中,我可以将路径设置为相对于dirname $0

2 个答案:

答案 0 :(得分:2)

通常的做法是更新package.path以包含A的父级(或将A放在路径上)。然后使用require并将模块称为A.barA.foo

请参阅manual entry on require

可以使用debug.getinfo找到目录,但在应用程序中使用debug模块并不是一个好主意,在这种情况下不是必需的。

请参阅this相关SO问题 - 使用package.path

答案 1 :(得分:2)

主要问题是package.path不考虑正在运行的脚本所在的目录。虽然Doug的解决方案有效但如果你不得不继续添加

这会变得乏味
package.path = 'foobar_path/?.lua;'..package.path

到您计划从其他工作目录运行的脚本。为简化操作,您可以创建一个模块,在需要时自动将运行脚本的目录添加到package.path。该模块将位于package.path中列出的默认位置之一,因此可以找到它。

-- moduleroot.lua
local moduleroot = arg and arg[0]
if moduleroot then
  local path = moduleroot:match [[^(.+[\/])[^\/]+$]]
  if path and #path > 0 then
    package.path = path..'?.lua;'..package.path
    package.cpath = path..'?.dll;'..package.cpath
    return path
  end
end

-- foo.lua
require "moduleroot"
require "bar"

事实上,这是一个很常见的问题, Penlight 包含一个处理此问题的便利设施: pl.app.require_here