【问题标题】:Using a resources/public directory in a boot-clj project在 boot-clj 项目中使用 resources/public 目录
【发布时间】: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”,这可能是不正确的。

【问题讨论】:

    标签: clojure boot-clj


    【解决方案1】:

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

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

    我会将其保留为默认值:

    (target :dir #{"target"})
    

    相当于只是

    (target)
    

    当您使用 serve 任务并提供您自己的环处理程序 ('myapp.server/handler) 时,您还需要确保您的处理程序将通过在您的类路径上指定正确的根目录(“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)。

    通过此设置,您的源文件(html、css 和来自resources/public 的其他文件)以及由任务生成的文件(如target/public 中的cljs)应该在您的浏览器中可用。

    【讨论】:

    • 问题仍然是 boot-cljs 将所有内容从资源目录传输到目标目录(最后使用同名任务时)我将更新问题并提供更多详细信息。
    • 现在可以使用了。很抱歉造成混乱 - 这些事情很棘手。无论资产路径设置为js 还是js/main.out,它都有效
    • 我认为你应该看看github.com/adzerk-oss/boot-cljs/issues/…。编译后的 js 的输出目录由 cljs.edn 文件的位置控制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 2022-12-09
    • 2021-02-26
    相关资源
    最近更新 更多