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

问题描述

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

.
├── dune-project
└── src
└── bin
    ├── dune
    └── main.ml

dune-project

(lang dune 2.7)
(name myproject)

(package
 (name myproject)
 (synopsis "myproject")
 (description "Basic project")
)

dune

(executable
 (name main)
 (public_name myproject)
)

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

_build
├── default
│   ├── dune-project
│   ├── Meta.myproject
│   ├── myproject.dune-package
│   ├── myproject.install
│   └── src
│       └── bin
│           ├── dune
│           ├── main.exe
│           └── main.ml
├── install
│   └── default
│       ├── bin
│       │   └── myproject -> ../../../default/src/bin/main.exe
│       └── lib
│           └── myproject
│               ├── dune-package -> ../../../../default/myproject.dune-package
│               └── Meta -> ../../../../default/Meta.myproject
└── log

因此,沙丘能够创建从main.exemyproject的符号链接,但我实际上希望myproject位于.而不位于_build/install/default/bin >

我尝试了三件事:

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

  • 在我的dune文件添加以下规则:

    (rule
     (target myproject)
     (deps   ../../myproject)
     (action (copy %{target} %{deps}))
    )
    

    这给了我以下错误

    ❯ dune build
    File "src/bin/dune",line 6,characters 0-88:
     6 | (rule
     7 |  (target myproject)
     8 |  (deps   ../../myproject)
     9 |  (action (copy %{target} %{deps}))
    10 | )
    Error: No rule found for myproject
    Error: Dependency cycle between the following files:
       _build/default/src/bin/myproject
    Done: 0/0 (jobs: 0)%          
    
  • 在我的dune文件添加以下规则:

    (rule
     (target main.exe)
     (deps   ../../myproject)
     (action (copy %{target} %{deps}))
    )
    

    这给了我以下错误

    ❯ dune build
    Error: Multiple rules generated for _build/default/src/bin/main.exe:
    - src/bin/dune:6
    - src/bin/dune:2
    Done: 0/0 (jobs: 0)%      
    

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

解决方法

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

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