Upgrade all environments

Is it possible upgrade all environments present in a machine at once? That is, instead of going project by project to upgrade packages, can I do that with a (few) commands?

On Unix systems you could presumably run the shell command find . -name "Project.toml" on your filesystem and pipe the results through a Pkg.activate(dir); Pkg.update() loop. But that’s a little scary unless you’ve been absolutely faithful about adding exhaustive [compat] declarations to all your Project.toml files. Much of the point of environments is that the Manifest records a known-working set of packages, and this will throw that away without verifying that your code in that project still works.

1 Like

So, no Julia built in command? Doesn’t Julia keep track of all environments so that when one does Pkg.gc() it doesn’t delete versions of packages used in other environments?

You can get a list of Active Manifests by using the verbose argument of gc command ( eg ]gc -v or Pkg.gc(verbose=true). Then by substituting Project to Manifest in the list you get all active Projects (but check that such instances are in your own directories, not in Julia ones such as packages, …).

I have done such a bash script for Linux/Cygwin, and use it for info purposes - see julia-listp in
https://github.com/jdadavid/juliashellutils.git

I did not generalized it to auto-update, it should be easy, but it is really a good idea, I doubt it. Others, any comments about the idea?

1 Like

You can find the manifests that Julia knows about in ~/.julia/logs/manifest_usage.toml. From there you could write some code to parse that TOML file, activate each environment and do Pkg.up in it. Probably about 10 lines of code altogether. I’m not entirely clear why it would be a good idea to do this though.

2 Likes

This would do it (please only try if you actually want to update all your environments to the latest versions of all packages):

using Pkg, TOML

for manifest in keys(TOML.parsefile(joinpath(DEPOT_PATH[1], "logs", "manifest_usage.toml")))
    Pkg.activate(dirname(manifest))
    Pkg.update()
end
4 Likes

Great thanks!
For the record, to update all environments to the latest version of a single package, replace Pkg.update() with Pkg.update("Example").

I would also add the following line

	if occursin(r"\.julia.packages",manifest);  @info "Skipping installed package $manifest"; continue; end

just before the activate in order to skip the registered/installed packages update, just to be sure …

My 2 cents.