3

我正在使用 ClojureScript、Boot 和 Boot-Cljs 构建 Firefox 附加组件。Firefox 的 Add-On SDK 采用了一定的目录结构;就我而言,我需要一个project-root/data目录来存放我的contentScriptFile.

我应该如何构建一个 ClojureScript 文件,该文件存在project-root/src/foo/core.cljs并输出或移动到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 很感兴趣,想弄清楚这一点,但我不得不承认,我在这方面浪费了很多时间(而且看起来我并不孤单)。鉴于我已经有一个简单的、可工作的 Clojure 脚本,它直接调用 ClojureScript 编译器 - 并使用它:output-to来完成我需要的工作 - 我可能会恢复使用这种方法来完成这个实验。

4

2 回答 2

3

关于 Boot 的奇怪之处在于,它看起来有点让你失望,任务——比如cljs任务——不一定直接与文件系统交互。它们与FileSet交互,这是一种它们被传递并期望返回的不可变值。

在构建开始时,Boot 将磁盘上的文件收集到构建的第一个 FileSet 中。然后,它通过任务堆栈使 FileSet 线程化。最后,Boot 将最后一个任务返回的 FileSet 写入目标目录

Boot 的sift任务可用于在 FileSet 内移动文件,返回一个新的 FileSet,但不能将文件移动到目标目录之外。

长话短说,我认为你可以通过指定一个目标目录来启动你想要的,如下所示:

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

于 2015-12-16T02:49:16.227 回答
2

此任务可能会有所帮助:

(deftask public []
  (comp (production)
        (build)
        (sift :invert true :include #{#"js/app.out" #"js/app.cljs.edn"})
        (target :dir #{"data"})))
于 2016-07-07T02:04:24.673 回答