假设我有一个具有以下结构的简单项目:
\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\nRun Code Online (Sandbox Code Playgroud)\ndune-project
(lang dune 2.7)\n(name myproject)\n\n(package\n (name myproject)\n (synopsis "myproject")\n (description "Basic project")\n)\nRun Code Online (Sandbox Code Playgroud)\ndune
(executable\n (name main)\n (public_name myproject)\n)\nRun Code Online (Sandbox Code Playgroud)\n编译时,我有一个具有以下结构的dune build新目录:_build
_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\nRun Code Online (Sandbox Code Playgroud)\n所以沙丘能够创建一个从main.exe到 的符号链接myproject,但我实际上想myproject在.而不是在_build/install/default/bin
我尝试了三件事:
\n(promote (into ../../))在我的文件中添加规则dune。它实际上是复制main.exe而不是myproject在源目录中,并且dune clean不会main.exe在根目录中删除
在我的文件中添加以下规则dune:
(rule\n (target myproject)\n (deps ../../myproject)\n (action (copy %{target} %{deps}))\n)\nRun 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)% \nRun Code Online (Sandbox Code Playgroud)\n在我的文件中添加以下规则dune:
(rule\n (target main.exe)\n (deps ../../myproject)\n (action (copy %{target} %{deps}))\n)\nRun 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)% \nRun Code Online (Sandbox Code Playgroud)\n老实说,我不知道我还能做什么。我阅读了手册,但找不到解决方案。我不介意我是否可以只输入dune run,但由于沙丘允许构建多个可执行文件,我知道这不是一个选项。我希望能够编写dune run myproject,因为我使用的是可执行文件的公共名称,但沙丘找不到它。所以我只想把它myproject放在我的根目录中,这样我就可以打字./myproject并感到高兴。