Julia中Pkg.develop无法识别本地包代码修改的问题
问题描述
我有一段名为main.jl的脚本,内容如下:
using Pkg Pkg.develop(path="path/to/MyPackage/") import MyPackage as mp mp.test()
在本地包MyPackage的src/test.jl文件中,定义了如下函数:
function test() println("test 1") end
首次运行main.jl时会输出"test 1",但保持REPL打开状态修改test()函数使其输出"test 2"后,再次运行脚本仍输出"test 1",请问哪里操作有误?
原因与解决方法
原因
Julia的REPL会话中,包一旦被加载就会常驻内存,默认不会自动检测并重新加载包内代码的修改。你首次运行脚本后,MyPackage已经被加载到当前会话,后续修改代码后,再次执行脚本调用的还是内存中旧版本的函数。
解决方法
方法一:使用Revise包实现热重载(推荐)
Revise是Julia生态中专门用于自动重载修改代码的工具,步骤如下:
- 打开REPL,进入包管理模式(按
]键),执行add Revise完成安装 - 修改你的
main.jl,在开头添加using Revise:
using Revise using Pkg Pkg.develop(path="path/to/MyPackage/") import MyPackage as mp mp.test()
或者在REPL会话启动时先执行using Revise,再运行脚本。之后修改MyPackage内的代码,无需重启REPL或手动重载,再次运行脚本就能调用更新后的函数。
方法二:手动重载包
如果不想使用Revise,修改代码后可以在REPL中手动触发包重载:
using Pkg Pkg.reload("MyPackage")
重载完成后再运行main.jl,就能输出修改后的内容。
另外注意:Pkg.develop只需要执行一次,后续运行脚本时可以去掉这一行,避免重复执行不必要的操作。
内容的提问来源于stack exchange,提问作者Shep Bryan
相关产品推荐
相关产品推荐

