硬件:ESP8266为核心的wemos d1 mini
固件:NodeMCU
任务:以module和require的形式封装自定义的库
编程语言:lua
IDE:ESPlorer
问题描述:
修改模块代码,删除原有文件,再次上传新文件,lua解释器并不加载新的文件(module),还是用原先的文件!
--File : module.lua
local module = {}
function module.foo()
print("module.foo called")
end
return module
-- File : main.lua
local mod = require("module")
mod:foo()
第一次下载module.lua和main.lua到wemos上,运行main.lua,输出为
> dofile("main.lua")
module.foo called
此时在module.lua中修改foo代码:
--File : module.lua
local module = {}
function module.foo()
print("module.foo changed")
end
return module
再次下载module.lua运行main.lua,输出结果为
> dofile("main.lua")
module.foo called
结果没有变化,此时查看wemos 中module.lua的代码,发现代码已经修改为changed!!
只有reset wemos后再次运行main.lua,新的module.lua才会生效
NodeMCU custom build by frightanic.com
branch: 1.5.4.1-final
commit: f03a8e45261fb5ab260e316173baacae9a248a62
SSL: false
modules: dht,file,gpio,mqtt,net,node,tmr,uart,wifi
build created on 2019-01-08 13:05
powered by Lua 5.1.4 on SDK 1.5.4.1(39cb9a32)
lua: cannot open init.lua
> print(uart.setup(0, 115200, 8, 0, 1, 1 ))
115200
>
Communication with MCU...
Got answer! AutoDetect firmware...
NodeMCU firmware detected.
=node.heap()
45144
> dofile("main.lua")
module.foo changed
原因:
require (modname)
功能:加载指定的模块。
此函数先检测package.loaded表中是否存在modname,存在则直接返回当中的值,没有则通过定义的加载器加载modname。
显然require 并没有比较文件新旧重新加载
解决方案,可以在package.loaded (table)删除modname,再次require;
或者用dofile代替require
local mod = dofile("module.lua")注意需要加上文件类型
结论:
调试module时,尽量使用dofile("modulename.lua")
稳定运行时,可以使用require("modulename")