Julia开发module的工作流程


#1

安装配置Revise.lj后,在jupyter notebook里using FooBar我自己的module FooBar后,是不是在atom里修改了FooBar.jl后并不会重新加载这个module?

不知道大家开发比较复杂的工程, 涉及多个module的,是用什么开发流程比较高效率,纯用atom还是atom和jupyter notebook配合? 如果每次修改module都要重新编译的话感觉迭代效率有点低,还是说大家先在notebook里写好function测试好最后再整理到module?


#2

用atom的external connection连接到 notebook kernel的话,好像2个不同的module, module1里using module2,都通过atom通信给kernel,不知道为什么会报找不到module2


#3

可能之前哪里搞错了,现在没什么问题了。有没有工具能在module更新后自动把涉及的代码重新跑一遍的.

看起来比较正确的方式是用 push!(LOAD_PATH, “PATH_TO_JL_FOLDER”) 然后 分module里不用include,只用using


#4

另外如果想在服务器上远程开发的话,目前有没有什么好用的方法,是不是只能等vscode插件完善


#5

简单说一下,当你using Revise之后,它会跟踪你的using和include(使用includet来包含文件),并在对应文件修改之后热更新一些代码。举个例子:在当前目录新建一个MyModule.jl

module MyModule
    f(x)=x+1
end

然后想办法包含它(比如加到LOAD_PATH)里

julia> using Revise

julia> push!(LOAD_PATH,".")
4-element Array{String,1}:
 "@"
 "@v#.#"
 "@stdlib"
 "."

julia> using MyModule
[ Info: Precompiling MyModule [top-level]

julia> MyModule.f(1)
2
(修改f的实现,改为f(x)=x+2)
julia> MyModule.f(1)
3
(删掉f的定义)
julia> MyModule.f(1)
ERROR: MethodError: no method matching f(::Int64)
Stacktrace:
 [1] top-level scope at REPL[9]:1
(增加g()=42的定义)
julia> MyModule.g()
42

如果你没修改类型定义之类的或者使用到生成函数,大部分修改应该都能跟踪到。如果更改没有生效,你可以检查一下Revise的跟踪状态,例如

julia> Revise.watched_files
Dict{String,Revise.WatchList} with 5 entries:
  "C:\\Users\\Azure\\.juli… => WatchList(1.56666e9, Set(["dict_sorting.jl", "or…
  "C:\\Users\\Azure\\.juli… => WatchList(1.56666e9, Set(["LoweredCodeUtils.jl"]…
  "C:\\Users\\Azure\\.juli… => WatchList(1.56666e9, Set(["utils.jl", "pkgfiles.…
  "C:\\Users\\Azure\\.juli… => WatchList(1.56666e9, Set(["utils.jl", "types.jl"…
  "C:\\Users\\Azure\\Deskt… => WatchList(1.56666e9, Set(["MyModule.jl"]))

#6

谢谢,虽然watched_files里有了我的文件,但改函数名字后并没有生效,不知道为啥


#7

开发比较复杂的工程, 涉及多个module的,是用什么开发流程比较高效率

dev底层工具箱,修改,然后测试所有下游工具箱。比如说 ]dev ./ImageCore.jl

另外如果想在服务器上远程开发的话,目前有没有什么好用的方法,是不是只能等vscode插件完善

我现在用vscode,除了没有atom的图形化Profiling和变量区这两个功能外,别的都还挺好的。

先在notebook里写好function测试好最后再整理到module?

  1. 在了解代码逻辑,能够不用在REPL里测试就修改代码的情况下会直接修改代码,然后补充test
  2. 如果idea还不是特别清楚,会通过REPL或者jupyter或者之类的方式来验证一下idea的主要部分是不是能够正常工作,然后回到第一步慢慢整合进代码库

#8

原来遇到bug了,还好已经解决了