使用 Boot 时将 to/move 编译的 Cljs 构建到任意目录的惯用方法是什么?

What is the idiomatic way to build to/move compiled Cljs to an arbitrary directory when using Boot?

我正在使用 ClojureScript、Boot 和 Boot-Cljs 构建 Firefox 附加组件。 Firefox 的 Add-On SDK 采用特定的目录结构;在我的例子中,我需要一个 project-root/data 目录,它将存放我的 contentScriptFile.

我应该如何构建位于 project-root/src/foo/core.cljs 中的 ClojureScript 文件并将其输出或移动到 project-root/data?我试过使用 boot sift --move 无济于事(我承认我不完全理解这个任务应该如何工作,需要哪些参数等等),使用 main.cljs.edn 清单并调整它的位置, :asset-path, :output-path, 等无济于事.

;; src/main.cljs.edn
{:require [foo.core]
 :init-fns [foo.core/init!]
 :compiler-options {:output-path "data"}}

;; build.boot
(set-env!
  :source-paths #{"src" "data"}
  :dependencies '[[org.clojure/clojure "1.7.0"]
                  [org.clojure/clojurescript "1.7.170"]
                  [adzerk/boot-cljs "1.7.170-3"]])

(require '[adzerk.boot-cljs :refer [cljs]])

(deftask build []
  (comp (cljs :optimizations :whitespace)))

我对 Boot 很感兴趣,想解决这个问题,但我不得不承认,我在这上面浪费了 很多 时间 (and it looks like I'm not alone ).既然我已经有了一个简单的、可工作的 Clojure 脚本,它直接调用 ClojureScript 编译器——并使用 :output-to 来做我需要的——我可能会回到那种方法来结束这个实验。

关于 Boot 的奇怪之处似乎让您有些困惑,那就是任务 - 例如 cljs 任务 - 不一定直接与文件系统交互。它们与 FileSet 交互,它们被传递给 return.

的一种不可变值

在构建开始时,Boot 将磁盘上的文件收集到构建的第一个 FileSet 中。然后,它通过任务堆栈将 FileSet 线程化。最后,Boot 将上一个任务 returned 的 FileSet 写入 target directory.

Boot 的 sift 任务可用于在 FileSet 中 移动文件,return创建一个新的 FileSet ,但不能将文件移出目标目录。

长话短说,我想你可以像这样指定要启动的目标目录来做你想做的事:

(set-env! :target-path "data" ...)

这项任务可能有帮助:

(deftask public []
  (comp (production)
        (build)
        (sift :invert true :include #{#"js/app.out" #"js/app.cljs.edn"})
        (target :dir #{"data"})))