dune init proj foo
doesn’t seem to generate any dune-project
file. Does that mean dune-project
files are optional? If so, how does dune know what package(s) I’m going to build? Ok, maybe it doesn’t care about packaging for a freshly bootstrapped project … but it does generate a foo.opam
. So yes, I’m confused.
dune-project files are required. dune init has some issues that need to be fixed
We reported just the same issue recently at dune#5429 while writing the RWO chapter on OCaml tooling.
Also, consequent creation of projects work in not expected for me manner. For example
➜ 1 dune init proj hello --ppx ppx_inline_test --inline-tests 4.13.1+flambda
Success: initialized project component named hello
➜ 1 tree 4.13.1+flambda
.
├── _build
│ └── log
└── hello
├── bin
│ ├── dune
│ └── main.ml
├── hello.opam
├── lib
│ └── dune
└── test
├── dune
└── hello.ml
5 directories, 7 files
It’s fine for now, but
➜ 1 dune init project asdf -ppx ppx_inline_test --inline-tests 4.13.1+flambda
Success: initialized project component named asdf
➜ 1 tree 4.13.1+flambda
.
├── _build
│ └── log
├── hello
│ ├── bin
│ │ ├── dune
│ │ └── main.ml
│ ├── hello.opam
│ ├── lib
│ │ └── dune
│ └── test
│ ├── dune
│ └── hello.ml
└── ppx_inline_test
└── asdf
├── asdf.opam
├── bin
│ ├── dune
│ └── main.ml
├── lib
│ └── dune
└── test
├── asdf.ml
└── dune
10 directories, 13 files
creates hierarchy that I don’t expect. Yes, I forgot extra dash, but it shouldn’t work like this.
This is a bit of a strange case, and has nothing in particular to do with dune init
, afaict, but just with CLI parsing in general (perhaps with cmdliner in particular?).
The schema for dune init
is:
dune init [OPTION]... INIT_KIND NAME [PATH]
But, in fact, the OPTION
s can be passed in at any point between the positional arguments. The third positional argument is the PATH
, which is documented thus:
If the optional PATH is provided, the component will be created there.
In the case of this invocation, I believe -ppx
is getting read as the -p
flag (short for --for-release-of-packages
) passed the value px
, and then ppx_inline_test
is being given as the third positional argument, specifying a directory path in which to create the project.
I definitely think the CLI around init
could be made simpler, but I’m afraid what you’re hitting here is more to do with the suboptimal nature of CLIs as a user interface
For anyone interested, I’ve supplied more information on this point here: "dune init project" doesn't create a dune project file, creates unnecessary _build file · Issue #5429 · ocaml/dune · GitHub
If you can figure out how to install from master, it should fix the problem of missing dune-project
files in the short term (until 3.0 is released), tho unfortunately it doesn’t seem like is as simple as opam pin https://github.com/ocaml/dune.git
at the moment