Lua:相对于模块读取文件

时间:2018-10-25 09:58:30

标签: lua

我正在尝试为Luakit编写一个模块,该模块需要一个.js文件并将其注入到每个页面中,因此在没有任何Web扩展支持的情况下,这是一个简单的包装程序/解决方法。我目前的唯一问题是,我似乎无法从目录my中找到如何在没有require的情况下读取文件(因为它不是.lua文件,我只是想以字符串形式读取)。模块已插入。显然,lua不在那儿寻找它。我不想指定绝对路径,因为它实际上仅取决于模块的位置。

...
 |- mymodule.lua
 \- mymodule.js

module.lua:

local f = assert(io.open("mymodule.js", "r"))
local jsbase = f:read("*all")
f:close()

-- ...

但是,这会导致

E [core/common/lualib]: Lua error: mymodule.js: No such file or directory

[编辑] 我需要的基本上是一个可用作io.open(findContainingDirPathOfCurrentModuleWithoutHardCoding()..'mymodule.js')

的函数

[编辑] Luakit在Lua 5.1上运行。

3 个答案:

答案 0 :(得分:0)

我尝试了一个简单的示例,该示例查找相对于模块的.js文件,但是我将其保存在与模块相同的目录中。

-- Structure
- init.lua
- mod
 |- mymodule.lua
 |- mymodule.js

 -- mymodule.lua
 local f = assert(io.open("mod/mymodule.js", "r"))
 local jsbase = f:read("*all")
 f:close()
 return jsbase

 -- mymodule.js
 str = "Test String"

 -- init.lua 
 local str = require "mod.mymodule"
 print(str) -- Test String

答案 1 :(得分:0)

这适用于Lua 5.2 / 5.3 / 5.4

mymodule.lua

local f = assert(io.open(({...})[2]:gsub("%.lua$", ".js"), "r"))
local jsbase = f:read("*all")
f:close()

答案 2 :(得分:0)

为解决发布的尝试,我现在找到了这个解决方案。它不是完美的,但是可以正常工作,并且如果模块名称是唯一的(特别是当.js的目录中没有其他package.path文件时)就应该没有问题地工作:

-- get name of this module
local modulename = (function (m)
  t = {}
  for e in m do
    table.insert(t, e)
  end
  return t[#t]
end)(string.gmatch(..., "[^.]+"))

local f = nil

-- find the js file named like this module from any relevant paths
for i in string.gmatch(package.path, "[^;]+") do
  -- ignore all ?/init.lua etc.
  if string.find(i, "?.lua") then
    f = io.open(i:gsub("?.lua$", modulename..".js"), "r")
    if f ~= nil then
      -- found a match!
      break
    end
  end
end

assert(f)

local jsbase = f:read("*all")
f:close()

-- ...