Hammerspoon中如何在Spoon包内require Lua脚本?
解决Hammerspoon Spoon内部子模块的require加载问题
核心问题原因
Hammerspoon的模块加载逻辑会将模块名中的.替换为/,当你尝试require("Foo.Spoon.my.bar")时,它会去查找~/.hammerspoon/Foo/Spoon/my/bar.lua,而非实际的~/.hammerspoon/Spoons/Foo.Spoon/my/bar.lua;直接require("my.bar")则因为当前Spoon目录不在Lua默认搜索路径里,导致找不到文件。
可行解决方法(无需修改require或使用绝对路径)
利用
hs.spoons.scriptPath()临时扩展模块搜索路径
在Foo.Spoon的init.lua中添加以下代码:-- 获取当前Spoon的根目录(即~/.hammerspoon/Spoons/Foo.Spoon/) local spoonRoot = hs.spoons.scriptPath() -- 将Spoon根目录加入Lua模块搜索路径,让Lua能找到内部子模块 package.path = string.format("%s;%s/?.lua", package.path, spoonRoot) -- 现在可以直接加载子模块 local barModule = require("my.bar")这个方法完全依赖Hammerspoon提供的API,不会破坏全局环境,且子模块的引用方式简洁直观。
直接构建路径用dofile加载
如果你不想修改全局的package.path,也可以通过hs.spoons.scriptPath()拼接子模块路径,再用dofile加载:local barModule = dofile(hs.spoons.scriptPath() .. "/my/bar.lua")这种方式更直接,适合只需要加载少数子模块的场景,不会影响其他模块的搜索路径。
内容的提问来源于stack exchange,提问作者Kirby
相关产品推荐
相关产品推荐

