我正在尝试设置一个启动项目,它使用一个资源目录保存子目录public。后者应该包含例如所有与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。服务器/处理程序知道只从资源/公共服务文件(由wrap-resource
或等效的合成resources
实现)。后者甚至默认为"private"。
但问题发生得更早:当运行boot dev
时,整个资源目录在目标目录中被复制,当然也包括private_file.txt
。(这是有意的行为吗?(我的意思是,文件可能很大,然后会占用两倍的磁盘空间)
在这一点上,我不确定main内部的:asset-path如何影响这一点。在这里的示例中,我将其保留为"js/main"。Out ",这可能不正确。
我认为问题是你将生成的代码放入源目录,这可能会导致你的构建任务变得混乱,因为它们将开始消耗它们生成的文件。元凶是:
(target :dir #{"resources/public"})
我将保留它作为默认值:
(target :dir #{"target"})
等价于
(target)
当您使用serve
任务提供您自己的环处理程序('myapp.server/handler
)时,您还需要确保您的处理程序将通过在您的类路径上指定正确的根目录("公共")来从您的类路径提供资源。可能你已经像这样使用ring.middleware.resource/wrap-resource
了:
(wrap-resource handler "public")
最后是您的main.cljs.edn
文件。它的:asset-path
应该设置为js
,因为它应该是你的服务器/处理程序提供的JS文件的相对路径(target/public/js
的文件将服务于http://localhost:xxxx/js
)。
有了这个设置,你的源文件(html, css和resources/public
中的其他文件)以及由target/public
中的cljs
等任务生成的文件应该可以在浏览器中使用。