【发布时间】:2016-08-10 10:22:52
【问题描述】:
我正在尝试设置一个启动项目,该项目使用一个资源目录,其中包含一个公共子目录。后者应包含例如所有与 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 或等效的组合 resources 实现。后者甚至默认为“私有”。
但问题发生得更早:
运行boot dev 时,整个资源目录会在目标目录中复制,当然包括private_file.txt。 (这是预期的行为吗?我的意思是文件可能非常大,然后它会占用双倍的磁盘空间)
此时我不确定 main 内部的 :asset-path 对此有何影响。在此处的示例中,我将其保留为“js/main.out”,这可能是不正确的。
【问题讨论】: