2

我正在尝试设置一个启动项目,该项目使用一个资源目录,其中包含一个公共子目录。后者应包含例如所有与 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”,这可能是不正确的。

4

1 回答 1

1

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

(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)以及由诸如cljsin之类的任务生成的文件target/public应该在您的浏览器中可用。

于 2016-08-10T19:44:17.730 回答