You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 14:00:57