opam
opam copied to clipboard
Minimize opam operations/Freeze packages during reinstall
This Stack Overflow question asked how to upgrade a single package, and it used opam reinstall
. Apparently --criteria=paranoid
seemed to help, but trying this with opam 2.1.2 no longer seems to work.
I occasionally have the need to reinstall a package to a specific version for quick testing, and in many cases it has no or few dependencies, so opam should be able to change it, but it still wants to reinstall way more packages than seems necessary. For instance, I just upgraded alt-ergo 1.01 to 2.0.0:
The following actions will be performed:
↘ downgrade camlzip 1.11 to 1.07 [required by alt-ergo]
↗ upgrade alt-ergo 1.01 to 2.0.0
↻ recompile why3 1.5.0 [uses camlzip]
Now, I just wanted to return to the previous state, by downgrading alt-ergo to 1.01 again (for testing purposes), but opam wants instead to perform 50 operations:
The following actions will be performed:
↻ recompile ocamlbuild 0.14.0 [upstream or system changes]
↻ recompile dune 3.0.2 [upstream or system changes]
↻ recompile ocamlfind 1.9.1 [upstream or system changes]
↻ recompile stdlib-shims 0.3.0 [uses dune]
↻ recompile stdint 0.7.0 [upstream or system changes]
↻ recompile sexplib0 v0.15.0 [upstream or system changes]
↻ recompile result 1.5 [uses dune]
↻ recompile re 1.10.4 [uses dune]
↻ recompile ppx_derivers 1.2.1 [uses dune]
↻ recompile ocaml-compiler-libs v0.12.4 [uses dune]
↻ recompile menhirSdk 20211012 [uses dune]
↻ recompile menhirLib 20211012 [uses dune]
↻ recompile landmarks 1.4 [uses dune]
↻ recompile easy-format 1.3.2 [upstream or system changes]
↻ recompile dune-private-libs 2.9.3 [uses dune]
↻ recompile csexp 1.5.1 [uses dune]
↻ recompile cppo 1.6.8 [uses dune]
↻ recompile zarith 1.12 [uses ocamlfind]
↻ recompile xml-light 2.4 [uses ocamlfind]
↻ recompile topkg 1.0.5 [uses ocamlbuild, ocamlfind]
↻ recompile camlzip 1.07 [uses ocamlfind]
↻ recompile base-bytes base [uses ocamlfind]
↻ recompile ocamlgraph 2.0.0 [uses dune]
↻ recompile odoc-parser 1.0.0 [upstream or system changes]
↻ recompile tyxml 4.5.0 [uses dune]
↻ recompile ppxlib 0.25.0 [uses dune, sexplib0]
↻ recompile menhir 20211012 [uses dune]
↻ recompile biniou 1.2.1 [upstream or system changes]
↻ recompile dune-site 2.9.3 [uses dune]
↻ recompile dune-configurator 2.9.1 [uses dune]
↘ downgrade alt-ergo 2.0.0 to 1.01 This release is too old. Please consider using version 1.30 that fixes many soundness bugs and brings a lot of improvements
↻ recompile ocp-indent 1.7.0 [uses dune, ocamlfind]
↻ recompile odoc 2.1.0 [upstream or system changes]
↻ recompile ppx_import 1.9.1 [uses dune]
↻ recompile ppx_deriving 5.2.1 [uses dune, ocamlfind]
↻ recompile landmarks-ppx 1.4 [uses dune]
↻ recompile psmt2-frontend 0.4.0 [uses dune]
↻ recompile yojson 1.7.0 [uses dune, biniou, easy-format]
↻ recompile zmq 5.1.4 [uses dune, stdint]
↻ recompile cairo2 0.6.2 [uses dune]
↻ recompile base v0.15.0 [upstream or system changes]
↻ recompile visitors 20210608 [uses dune]
↻ recompile ppx_deriving_yojson 3.6.1 [upstream or system changes]
↻ recompile dot-merlin-reader 4.1 [upstream or system changes]
↻ recompile lablgtk3 3.1.2 [uses dune]
↻ recompile ppx_sexp_conv v0.15.0 [uses dune, base, sexplib0]
↻ recompile ppx_compare v0.15.0 [uses base, dune]
↻ recompile merlin 4.4-413 [upstream or system changes]
↻ recompile lablgtk3-sourceview3 3.1.2 [uses dune]
↻ recompile why3 1.5.0 [uses ocamlfind]
↻ recompile ppx_hash v0.15.0 [uses base, dune]
↻ recompile tuareg 2.2.0 [uses merlin]
===== ↻ 51 ↘ 1 =====
I don't understand exactly why it wants to recompile ocamlbuild, dune and ocamlfind, but I'd like it not to, if possible. In such cases, it seems that --criteria=paranoid
might help. I tried --criteria=-changed
and some variations, but it didn't change much. If there were a syntax to say, for instance, "freeze[<package>]
" or something, I could try using it.
Is there such a syntax? Or a way to quickly restore the previous state, without having to reinstall so many things? Or is the upstream or system changes
message actually indicating some irreversible changes, and there is nothing I can do about it currently?
In case it's useful, here's the output of opam config report
:
# opam-version 2.1.2
# opam-version 2.1.2
# self-upgrade no
# system arch=x86_64 os=linux os-distribution=fedora os-version=36
# solver builtin-mccs+glpk
# install-criteria -removed,-count[avoid-version,changed],-count[version-lag,request],-count[version-lag,changed],-count[missing-depexts,changed],-changed
# upgrade-criteria -removed,-count[avoid-version,changed],-count[version-lag,solution],-count[missing-depexts,changed],-new
# jobs 11
# repositories 1 (http), 1 (version-controlled) (default repo at 86134262)
# pinned 0
# current-switch 4.13.1
# ocaml:native true
# ocaml:native-tools true
# ocaml:native-dynlink true
# ocaml:stubsdir /home/andr/.opam/4.13.1/lib/ocaml/stublibs:/home/andr/.opam/4.13.1/lib/ocaml
# ocaml:preinstalled false
# ocaml:compiler 4.13.1
Note that most of the useless reinstallations are fixed in master (opam 2.2.0) in https://github.com/ocaml/opam/pull/5118
Great! I'll try that as soon as I can and report back here.