Truffle首次migrate后build/contracts/HelloWorld.json源码不更新问题
问题原因
- Truffle默认使用增量编译机制,仅当检测到合约源码文件变更时才会重新生成
build/contracts目录下的合约 artifacts(对应json文件),如果旧缓存未清理,编译后的ABI、源码字段会保留首次编译的旧版本内容 - Truffle的
migrate命令默认仅执行未运行过的迁移脚本,首次迁移后已生成迁移记录,后续直接执行migrate不会重新部署修改后的新合约,链上运行的依然是首次部署的旧版本合约 - Truffle Develop 环境会缓存已部署的合约地址和ABI,调用
HelloWorld.deployed()时默认返回旧合约实例,自然不存在新版本新增的message、setMessage等方法
解决步骤
- 强制全量编译合约,跳过增量编译逻辑,生成最新的artifacts文件,执行命令:
truffle compile --all - 进入truffle develop交互环境后,强制重新执行所有迁移脚本,部署新版本合约,执行命令:
migrate --reset - 重新获取合约实例即可正常调用新版本的所有方法:
let instance = await HelloWorld.deployed() // 调用hello方法会返回构造函数传入的初始值"Hello world constructor" await instance.hello() // 可正常调用新增的public变量和方法 await instance.message() await instance.setMessage("blah")
补充说明:如果执行上述步骤后问题依然存在,可以直接退出truffle develop进程重启,再重新执行上述操作,避免本地测试链的缓存未清理干净。
内容的提问来源于stack exchange,提问作者Омар Меджидов
相关产品推荐
相关产品推荐

