Using the Julia Package Manager
This is a very brief introduction to the Julia package manager, intended for newcomers to Julia who are here primarily to use the ACEsuit. But it is not really ACE specific at all.
The package manager provides functionality to organize reproducable Julia projects. A project is specified by a Project.toml where the user specifies which packages are required, and version bounds on those packages. The Package manager can then resolve these dependencies which results in a Manifest.toml where the full Julia environment is precisely specified. This can be used in a workflow as follows:
To start a new project that uses
ACEpotentials.jl, e.g. to develop a new interatomic potential forTiAlwe first create a new folder where the project will live, e.g.,ace_TiAl_project. Change to that folder and start the Julia REPL. Type]to switch to the package manager, then activate a new project in the current directory viaactivate .You now have an empty project. Start adding the packages you need, often just
add ACEpotentialswill suffice. Typestatusto see your required packages listed. (Note this is only a subset of the installed packages!). Exit the REPL and typels; you will then see a new fileProject.tomlwhich lists the project requirements, and aManifest.tomlwhich lists the actually packages and the version that have been installed.Specify version bounds: We strongly encourage doing this rigorously! Open
Project.tomlin an editor and under the [compat] section you can now add version bounds, e.g.ACEpotentials = "0.6.1"following semver. Please see the Pkg.jl docs for details on how to specify those bounds. Start a Julia REPL again, type]to switch to the package manager and thenupto up- or down-grade all installed packages to the latest version compatible with your bounds.
Using a Development Branch (rarely required)
If you are a user rather than developer it should almost never be required for you to check out a package (or, dev it in the package manager). When developers make changes to - say - ACEpotentials.jl they will always immediately tag another version and then you can adjust your version bounds in your project to update as well as enforce which version to use. However a developer would frequently do this, and occasionally it might be required when iterating between a user and developer for testing. There are multiple ways to achieve this; the following is our recommended procedure:
Suppose for example that a development branch co/dev of ACE1.jl is needed in a project project. Then one should perform the following steps:
- Make sure
ACE1has been added toproject/Project.toml - In a separate folder,
/path/to/, cloneACE1.jl
cd /path/to
git clone git@github.com:ACEsuit/ACE1.jl.git
git checkout co/devso that the repo will now live in /path/to/ACE1.jl
- Go to and activate
project, then in a Julia REPL switch to the package manager]and execute
dev /path/to/ACE1.jlThis will replace the ACE1 package in the Manifest with the version that lives in /path/to/ACE1.jl
Later on, when you want to go back to the standad Pkg versin control you can simply free ACE1.
Further Notes
- The
Project.tomlshould always be committed to your project git repo. WhetherManifest.tomlis also committed is a matter of taste or context. Tracking the Manifest will (normally) ensure future compatibility since it allows you to reconstruct the precise Julia environment that was used when the Manifest was created.
Links
- https://pkgdocs.julialang.org/v1/
- https://pkgdocs.julialang.org/v1/compatibility/