使用沙丘将生成的可执行文件复制到我的根目录中
Copy the produced executable in my root dir with dune
假设我有一个具有以下结构的简单项目:
.
├── 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
所以 dune 能够创建从 main.exe
到 myproject
的符号链接,但我实际上希望 myproject
位于 .
而不是 _build/install/default/bin
我尝试了三件事:
在我的 dune
文件中添加规则 (promote (into ../../))
。它实际上在源目录中复制 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
因为我正在使用我的可执行文件的 public 名称但是沙丘找不到它。所以我只想在我的根目录中有 myproject
这样我就可以输入 ./myproject
并且开心。
你知道dune exec
吗?就是你说的dune run
我相信
从项目的根目录,您可以执行 dune exec ./bin/main.exe
。
假设我有一个具有以下结构的简单项目:
.
├── 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
所以 dune 能够创建从 main.exe
到 myproject
的符号链接,但我实际上希望 myproject
位于 .
而不是 _build/install/default/bin
我尝试了三件事:
在我的
dune
文件中添加规则(promote (into ../../))
。它实际上在源目录中复制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
因为我正在使用我的可执行文件的 public 名称但是沙丘找不到它。所以我只想在我的根目录中有 myproject
这样我就可以输入 ./myproject
并且开心。
你知道dune exec
吗?就是你说的dune run
我相信
从项目的根目录,您可以执行 dune exec ./bin/main.exe
。