Esy Install
But in ocaml this time. With a real solver, so we get good dependencies.
Status: self-hosting! Also can install reason-wall-demo
Completed
- parsing opam files & mostly converting the dependencies (I bail on the more complex boolean operations, pretending they are "any")
- parsing package.json files
- talking to the npm registry
- looking in a local copy of the opam registry
- using MCCS (a SAT solver) to find a valid assignment of dependencies!
- tracking buildDependencies separately
- sharing resolved buildDependencies when possible
- generating a lockfile! (it's yojson at the moment, so don't expect anything fancy)
- fetching all the things, with some opam -> package.json conversion
- write out override files
- get the files from opam too tho
- handle override patches too
- add a
_resolved
field - opam conversion
- incorporate
esy-opam-overrides
- incorporate
- get jbuilder building
- get [the test repository] building!
- handle opam versions correctly
(>= 1.2.0 & < 1.3.0)
- respect the "available" flag in
opam
- get tsdl building ok
- get reason-wall-demo building!
- be able to install its own deps!
- ~ should resolve before the empty string in opam land
- make the "fetch" step not depend on having
opam-repository
around - grab & update esy-opam-overrides and opam-repository automatically
After that
- be able to process normal npm dependencies -- first by trying to do it without conflicts, and then relaxing the requirement and doing an after-pass to remove unneeded duplicates.
- output a nice "esy.resolved" file that
esy b
can then read to know where dependencies live.
Needed less urgently
- use Lwt! So we can parallelize a ton of things
- actually validate checksums
- deciding what we want to do with devDependencies (currently they're dumped into build dependences)
- make the generated lockfile a nicer format (maybe yaml/toml?)
- parallelize some things, but make sure not to compromise reproducability
- handle the not-fresh case
- inflate from lockfile
- check staleness
- add/remove/upgrade deps
Needed for cross-platform
- use Cohttp instead of shelling out to curl
- maybe use an ocaml git client? instead of shelling out to git
- use an ocaml decompression library instead of shelling out to tar
- audit for "/" vs Filename.concat
Later on
- maybe fetch tarballs from the opam mirror directly
- maybe use a global cache for fetched things? currently using a project-local cache
- support multiple architecture targets!