使用 dune 将生成的可执行文件复制到我的根目录中

Lho*_*ooq 5 ocaml ocaml-dune

假设我有一个具有以下结构的简单项目:

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 dune-project\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 bin\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 dune\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.ml\n
Run Code Online (Sandbox Code Playgroud)\n

dune-project

\n
(lang dune 2.7)\n(name myproject)\n\n(package\n (name myproject)\n (synopsis "myproject")\n (description "Basic project")\n)\n
Run Code Online (Sandbox Code Playgroud)\n

dune

\n
(executable\n (name main)\n (public_name myproject)\n)\n
Run Code Online (Sandbox Code Playgroud)\n

编译时,我有一个具有以下结构的dune build新目录:_build

\n
_build\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 default\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 dune-project\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 META.myproject\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 myproject.dune-package\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 myproject.install\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 bin\n\xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 dune\n\xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.exe\n\xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.ml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 install\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 default\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 bin\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 myproject -> ../../../default/src/bin/main.exe\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 lib\n\xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 myproject\n\xe2\x94\x82\xc2\xa0\xc2\xa0             \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 dune-package -> ../../../../default/myproject.dune-package\n\xe2\x94\x82\xc2\xa0\xc2\xa0             \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 META -> ../../../../default/META.myproject\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 log\n
Run Code Online (Sandbox Code Playgroud)\n

所以沙丘能够创建一个从main.exe到 的符号链接myproject,但我实际上想myproject.而不是在_build/install/default/bin

\n

我尝试了三件事:

\n
    \n
  • (promote (into ../../))在我的文件中添加规则dune。它实际上是复制main.exe而不是myproject在源目录中,并且dune clean不会main.exe在根目录中删除

    \n
  • \n
  • 在我的文件中添加以下规则dune

    \n
    (rule\n (target myproject)\n (deps   ../../myproject)\n (action (copy %{target} %{deps}))\n)\n
    Run Code Online (Sandbox Code Playgroud)\n

    这给了我以下错误:

    \n
    \xe2\x9d\xaf dune build\nFile "src/bin/dune", line 6, characters 0-88:\n 6 | (rule\n 7 |  (target myproject)\n 8 |  (deps   ../../myproject)\n 9 |  (action (copy %{target} %{deps}))\n10 | )\nError: No rule found for myproject\nError: Dependency cycle between the following files:\n   _build/default/src/bin/myproject\nDone: 0/0 (jobs: 0)%          \n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
  • 在我的文件中添加以下规则dune

    \n
    (rule\n (target main.exe)\n (deps   ../../myproject)\n (action (copy %{target} %{deps}))\n)\n
    Run Code Online (Sandbox Code Playgroud)\n

    这给了我以下错误:

    \n
    \xe2\x9d\xaf dune build\nError: Multiple rules generated for _build/default/src/bin/main.exe:\n- src/bin/dune:6\n- src/bin/dune:2\nDone: 0/0 (jobs: 0)%      \n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
\n

老实说,我不知道我还能做什么。我阅读了手册,但找不到解决方案。我不介意我是否可以只输入dune run,但由于沙丘允许构建多个可执行文件,我知道这不是一个选项。我希望能够编写dune run myproject,因为我使用的是可执行文件的公共名称,但沙丘找不到它。所以我只想把它myproject放在我的根目录中,这样我就可以打字./myproject并感到高兴。

\n

Lou*_*ché 2

你知道吗dune exec?这就是你所说的dune run我相信的。

从项目的根开始,您可以执行以下操作dune exec ./bin/main.exe