dune 多執行擋設定問題

Dev Tool OCaml Dune

近期使用 OCaml 在解 AoC,因為一天都會有兩題,所以我都放同個資料夾 q1.ml, q2.ml,dune 設定為

(executables
 (names q1 q2)
 (public_names dayXX_q1 dayXX_q2)
 (libraries lib))

但有時我需要針對當天的題目做共用函數,這種方法就行不通,因為 dune 在下 executables 的情況下默認該資料夾都是執行擋,所以下 (modules common) 會錯誤,所以我將他分開來寫

(executable
 (name q1)
 (public_name dayXX_q1)
 (modules common)
 (libraries lib))

(executable
 (name q2)
 (public_name dayXX_q2)
 (modules common)
 (libraries lib))

似乎解決了問題,但是某一天我使用外部 lib(Core) 時,VSCode 卻報錯給我,但實際上可以編譯,似乎 VSCode extension 在讀設定時只認單個 executable,但是用 executables 又沒辦法使用同資料夾底下的 module,後來找到方法是手動排除某個檔案讓 dune 不再認定他是執行擋

https://dune.readthedocs.io/en/stable/reference/dune/library.html

<modules> uses the Ordered Set Language, where elements are module names and don’t need to start with an uppercase letter. For instance, to exclude module Foo, use (modules (:standard \ foo)).

(executables
 (names q1 q2)
 (public_names dayXX_q1 dayXX_q2)
 (modules
  (:standard \ common))
 (libraries lib dayXXlib))

(library
 (name dayXXlib)
 (modules common))