- Boot
- task
- Boot environment
- Java environment
- target
- fileset
- Options
- 例子
Boot
Boot 是一个建构工具 http://boot-clj.com/
brew install boot-clj
类似 Gulp, 基于 task 进行组合以及运行, 社区有一些常用插件:
https://github.com/boot-clj/boot/wiki/Community-Tasks
Boot 通过命令行启动, 通过 build.boot 文件配置.build.boot 实际上是一个 Clojure 脚本, 运行时被读取.
task
任务, 大概相当于 Gulp 里的 task, 可以从命令行调用.
任务可以进行组合, 一次顺序执行多个任务.
简单的 task 可以通过这个 Macro 定义:
(deftask null-task"Does nothing."[](fn [next-task](fn [fileset](next-task fileset))))
多个 task 可以通过 comp 函数组合然后执行:
https://github.com/boot-clj/boot/wiki/Tasks
Boot environment
Boot 的环境变量, 通过 set-env! 进行修改, 常用的环境变量:
resource-paths作为源码输入, 也能够进入 jar 包里source-paths作为源码输入, 但不能进入 jar 包里asset-paths作为静态资源输入, 也能够进入 jar 包里dependencies整个项目的依赖
完整的环境变量的列表参考 Wiki:
https://github.com/boot-clj/boot/wiki/Boot-Environment
Java environment
大致相当于 Boot 的配置文件, 主要是一般可以是:
=>> cat ~/.boot/boot.properties#http://boot-clj.com#Wed Mar 23 17:58:25 CST 2016BOOT_CLOJURE_NAME=org.clojure/clojureBOOT_CLOJURE_VERSION=1.8.0BOOT_VERSION=2.5.5BOOT_EMIT_TARGET=no
注意 BOOT_EMIT_TARGET 这个环境变量在 Boot 中有过大的调整.
原来 Boot 默认会输入内容到 target, 后来建议关闭这个行为.
https://github.com/boot-clj/boot/wiki/Configuring-Boot
target
target 现在是一个 task, 运行 task 会把文件默认输出到 target/ 路径.
target task 调用时可以通过 :dir 设置路径的位置, 但一般不用设置.
(target :dir #{"compiled/"})
fileset
大致可以认为是文件的集合, 也是 task 之间传递的主要内容.
从前面提到的 source-paths 等路径开始读取, 但根据参数不同而有不同特性.
其实 task 运行主要就是针对文件操作, 其中经常用到临时文件.
相对于 Gulp 使用文件流, Boot 使用的是 fileset 和临时文件.
https://github.com/boot-clj/boot/wiki/Filesets
Options
定义 task 参数时, 可以通过这套 DSL 定义参数的名称和类型,
一般不写 task 或者插件不需要深入. 比较复杂, 需要看文档才能明白用途:
(deftask options"Demonstrate the task options DSL."[a a-option VAL kw "The option."c counter int "The counter."e entry VAL sym "An entrypoint symbol."f flag bool "Enable flag."o o-option VAL str "The other option."]*opts*)
https://github.com/boot-clj/boot/wiki/Task-Options-DSL
例子
一个编译 cljs 的简单配置, 编译 src/ 里的文件到 target/:
(set-env!:dependencies '[[org.clojure/clojurescript "1.9.36" :scope "test"][org.clojure/clojure "1.8.0" :scope "test"][adzerk/boot-cljs "1.7.170-3" :scope "test"]])(require '[adzerk.boot-cljs :refer [cljs]])(deftask build-advanced [](set-env!:source-paths #{"src"})(comp(cljs :optimizations :advanced)(target)))
