如果我有两个脚本在同一目录中相互引用
A/
foo.lua
bar.lua
foo.lua
require "bar"
bar.lua
print "It worked"
然后从同一文件夹运行 lua 可执行文件就可以了
cd A; lua foo.lua
但从另一个文件夹运行解释器失败,并显示“未找到模块‘bar’”消息
cd A/..; lua A/foo.lua
有没有办法让我的相对导入不依赖于当前工作目录?例如,在批处理文件中,我可以将路径设置为相对于 dirname $0
。
最佳答案
主要问题是 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
。
关于lua - 是否可以根据 Lua 脚本的位置而不是当前目录进行导入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11714204/