ocaml / dune

A composable build system for OCaml.
https://dune.build/
MIT License
1.61k stars 401 forks source link

[pkg] fetch dependencies without building the project #10949

Open maiste opened 1 week ago

maiste commented 1 week ago

Context

In the current behaviour, unless you have the exact target, it is impossible to download the dependencies without building the project. A nice feature would be a command that fetch the project dependencies in the same way you would with dune build. This is important in the context of Dockerfile, where you can save some computation time by caching this stage.

Solution

We can implement a dune pkg fetch command that triggers the fetch rule for the entire project.

rgrinberg commented 1 week ago

What about just introducing an alias @pkg-fetch? This is the more standard mechanism for collecting targets in dune.

maiste commented 1 week ago

Yes, definitely! It makes more sense. Another proposition was dune build @deps.

The original question was if there was a way to mimic the behaviour of opam install --deps-only --with-test . in the context of Dune Package Management. It means that it should fetch the target and build them too. However, I don't know if we have the possibility to execute the test part?

leostera commented 1 week ago

Thanks for opening the issue @maiste 🙏🏼 To clarify, we have 2 use-cases here.

  1. Writing a Dockerfile where we can stage building dependencies separate from building the entire project, and cache that based off the dune-project (or eventually the dune.lock):
FROM ubuntu

RUN curl https://get.ocaml.org | bash 

# Adds project + deps
ADD dune-project .
RUN dune pkg lock

# Fetch and build dependencies only if the above changes
RUN dune build @deps 

# Adds rest of the sources
ADD . .
RUN dune build
  1. A single command to fetch all external / downloadable resources for a project, to let you work without connectivity:
$ git clone github.com/my/project project
$ cd project
$ dune fetch
$ # now i can go offline
$ dune build 
rgrinberg commented 1 week ago

The original question was if there was a way to mimic the behaviour of opam install --deps-only --with-test . in the context of Dune Package Management. It means that it should fetch the target and build them too. However, I don't know if we have the possibility to execute the test part?

We already build the test deps. So dune runtest should work.