主要问题是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
.