使用boot-clj项目中的资源/公共目录

时间:2016-08-10 10:22:53

标签: clojure boot-clj

我正在尝试设置启动项目,该项目使用包含子目录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.server / handler知道只提供来自资源/公共文件的文件(由wrap-resource实现的文件或等效的组件resources。后者甚至默认为" private&# 34。

但问题更早发生: 当运行boot dev时,整个资源目录将在目标目录中重现,当然包括private_file.txt。 (这是预期的行为吗?,我的意思是文件可能很大,然后会消耗双倍的磁盘空间)

此时我不确定来自main内部的:asset-path如何影响这一点。在这里的示例中,我将其保留为" js / main.out",这可能不正确。

1 个答案:

答案 0 :(得分:1)

我认为问题在于您将生成的代码放入源目录中,这可能会导致构建任务混乱,因为它们将开始消耗它们生成的文件。罪魁祸首是:

(target :dir #{"resources/public"})

我会将其保留为默认值:

(target :dir #{"target"})

等同于

(target)

当您使用serve任务提供自己的环处理程序('myapp.server/handler)时,还需要确保处理程序通过在您的类路径上指定正确的根目录来提供资源。 classpath(" public")。可能你已经在使用ring.middleware.resource/wrap-resource了:

(wrap-resource handler "public")

最后一件事是您的main.cljs.edn文件。其:asset-path should be set to js as it should be the relative path to JS files served by your server/handler(来自target/public/js的文件将被投放http://localhost:xxxx/js)。

通过此设置,您的源文件(来自resources/public的html,css和其他文件)以及cljstarget/public等任务生成的文件应该可以在浏览器中使用。< / p>