Lua:相对于模块读取文件
2018-10-25 11:32:13
收藏:0
阅读:264
评论:3
我正在尝试为Luakit编写一个模块,该模块接受一个.js文件并将其注入每个页面,因此在没有任何Web扩展支持的情况下进行简单的包装/解决方案。 我目前唯一的问题是我似乎找不到如何读取文件(因为它不是.lua文件,我只想将其作为字符串读取)从我的模块所在的目录中。 显然,Lua不会在那里查找它。 我不想指定绝对路径,因为它实际上完全取决于我的模块的位置。
...
|- mymodule.lua
\- mymodule.js
module.lua:
local f = assert(io.open(“mymodule.js”,“r”))
local jsbase = f:read(“*所有”)
f:close()
-- ...
但是,这导致
E [core/common/lualib]:Lua错误:mymodule.js:没有这样的文件或目录
**_\ [编辑] _**我需要的基本上是一个函数,用作io.open(findContainingDirPathOfCurrentModuleWithoutHardCoding()..'mymodule.js')
_\ [编辑] _ Luakit在Lua 5.1上运行。
点赞
用户6834680
这在 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()
2018-10-25 11:00:50
用户4067384
通过调整已发布的尝试,我现在得到了这个解决方案。它不是完美的,但还不错,并且应该可以在模块名称唯一的情况下正常工作(特别是当package.path中没有其他.js文件时):
-- 获取这个模块的名称
local modulename = (function (m)
t = {}
for e in m do
table.insert(t, e)
end
return t[#t]
end)(string.gmatch(..., "[^.]+"))
local f = nil
-- 从任何相关路径中查找与此模块同名的js文件
for i in string.gmatch(package.path, "[^;]+") do
-- 忽略所有的?/init.lua等等
if string.find(i, "?.lua") then
f = io.open(i:gsub("?.lua$", modulename..".js"), "r")
if f ~= nil then
--找到匹配!
break
end
end
end
assert(f)
local jsbase = f:read("*all")
f:close()
-- ...
2018-10-25 21:31:41
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

我尝试了一个简单的例子,找到相对于模块的
.js文件,但是我将其保留在与模块相同的目录中。-- 结构 - 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 = "测试字符串" -- init.lua local str = require "mod.mymodule" print(str) -- 测试字符串