我正在尝试设置一个启动项目,该项目使用一个资源目录,其中包含一个公共子目录。后者应包含例如所有与 Web 相关的内容、编译的 clojurescript 等。
这对于您想要持有不打算公开公开的资源的情况是有意义的。
在没有额外的公共目录的情况下,它可以完美地工作。尝试使用附加的子目录时,我遇到了错误。以下是相关配置:
在 build.boot 中:
(set-env! :resource-paths #{"resources"} ...)
...
(deftask dev
[]
(comp
(serve
:handler 'myapp.server/handler
:reload true
:port 3000)
(watch)
(reload)
(cljs-repl)
(cljs)
(target :dir #{"resources/public"})))
从资源目录内部:
bash-4.3$ tree
└── public
├── index.html
└── js
└── main.cljs.edn
而 main.cljs.edn 看起来像:
{:require [{{name}}.core]
:compiler-options {:asset-path "js/main.out"}}
调用boot dev
时会发生以下情况: ClojureScript 继续编译错误,直到手动终止该进程。它看起来像是与某些相对路径相关的递归错误。
Compiling ClojureScript...
• public/js/main.js
Writing target dir(s)...
java.util.concurrent.ExecutionException: java.nio.file.NoSuchFileException: resources/public/public/public/js/main.out/goog/deps.js
而它继续运行的时间越长,就会public/public/public/..
扩展。
有人建议可以解决这个问题吗?
更新
这是问题的更新版本:
考虑资源文件夹的这种结构:
bash-4.3$ tree
└── private_file.txt
└── public
├── index.html
└── js
└── main.cljs.edn
以及 build.boot 中的以下部分:
(set-env! :resource-paths #{"resources"} ...)
(deftask dev
[]
(comp
(serve
:handler 'myapp.server/handler
:reload true
:port 3000)
(watch)
(reload)
(cljs-repl)
(cljs)
(target)))
'myapp.server/handler 知道只提供来自资源/公共的文件(由wrap-resource
或 compojure 等效实现resources
。后者甚至默认为“私有”。
但是问题发生得更早:当运行boot dev
整个资源目录时,目标目录中会被复制,private_file.txt
当然包括。(这是预期的行为吗?,我的意思是文件可能会很大,然后它会占用双倍的磁盘空间)
在这一点上,我不确定 main 内部的 :asset-path 如何影响这一点。在此处的示例中,我将其保留为“js/main.out”,这可能是不正确的。