【问题标题】:Is it possible to make imports depend on the location of my Lua script instead of the current directory?是否可以根据我的 Lua 脚本的位置而不是当前目录进行导入?
【发布时间】:2012-07-27 16:34:08
【问题描述】:

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

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

【问题讨论】:

标签: lua


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    manual entry on require

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

    查看this相关的SO问题——使用package.path

    【讨论】:

      猜你喜欢
      • 2023-03-29
      • 1970-01-01
      • 2022-11-22
      • 1970-01-01
      • 2011-03-13
      • 1970-01-01
      • 2017-10-26
      • 2021-11-07
      • 1970-01-01
      相关资源
      最近更新 更多