The most practical way to develop code in Julia, particularly when the code becomes more complex, is to write
modules and use the
To install the
Revise package, do:
julia> ] add Revise
The workflow is, then:
Create a file with a function, for example:
function f(x) y = 2*x return y end
Create a file called, for example,
MyModule.jl, in which you define a module of the same name. Include the files with your function definitions in this module:
module MyModule export f include("./f.jl") end
export f command makes the
f function visible from outside the module. That is, later when you load the module with
using MyModule you will be able to directly call
f(x) instead of having to type
MyModule.f(1). Exporting or not functions is optional.
Now, start Julia and load the module with the following commands:
using Revise push!(LOAD_PATH,"/path/to/MyModule") using MyModule
(it is a good idea to put these commands in a file, lets say
devel.jl, to load it with
julia -i devel.jl every time you start a development section).
This will load the module with its functions. Since the module was loaded after
Revise, the changes to the files included in that module will be tracked and updated automatically.
That means that:
julia> using Revise julia> push!(LOAD_PATH,"/path/to/MyModule") julia> using MyModule julia> f(1) 2
Now, if I modify the file
f.jl such that the function multiplies the value of
x by 5, and save it, we have:
julia> f(1) 5
Thus, the REPL section can be kept open and I can change and modify my package functions without having to load all the packages all the time. The only situation, for now, that will require the restart of Julia is the redefinition of a
struct, which for complicated reasons
Revise is not able to track appropriately and update the state of the Julia section.