Clojure 构建工具 boot 粗略

粗略记录一些过去一天看 boot 的资料的一些感想, 但不会深刻
大体的内容能够看一下官网和一篇比较热门的博客html

http://boot-clj.com/
http://blog.michielborkent.nl/blog/2015/06/06/from-leiningen-to-boot/git

关于

大体的状况我介绍下, 若是有刚学 Clojure 的同窗, 虽然我也算新手...
Clojure 是基于 Java 的, 按照 jar 的方式打包成二进制文件
细节不许确, 但大体是把 classpath 的资源全映射到 target/ 目录而后打包的
Clojure 用 Maven 和 Clojars 两个官方仓库, 后者主要是用户贡献的模块github

此前 Leiningen 一直是首选, 全部的教程都是 lein 什么 lein 什么
可是最近有看到 boot 热门起来, 包括在下面这份 ClojureScript 的教程上换了
https://github.com/magomimmo/modern-cljs
熟悉 JavaScript 生态的同窗, 我想说这二者区别很像 Grunt 和 Gulp
一个是定义好了任务, 只要写配置就行了, 另外一个能够定义任务组合任务
我是出于组合任务的缘由, 须要切换到 boot 以便我在 Gulp 中的习惯能够继续npm

可是呢, boot 生态如今远没有 Leiningen 丰富, 能够对比一下
https://github.com/boot-clj/boot/wiki/Community-Tasks
https://github.com/technomancy/leiningen/wiki/Plugins
包括一些 boot task 估计也正在完善当中. 有点被 npm 文化入侵的感受, 快而乱服务器

文档

Leiningen 的文档若是有人看过, 大概看吐了...个人意思是太长了
一个建构工具文档长得不得了, 没心思看. boot 的文档也很长, 只能说还好
https://github.com/boot-clj/boot/wiki
大体上要明白一些概念吧, 虽然和 Gulp 类似度不小, 可是术语是新的:架构

  • task 对应任务mvc

  • fileset 对应 Gulp 里的 file streamide

  • middleware 中间件, 其实和 task 差很少的函数

boot 的架构图看上去就和 Koa 的架构图同样, 洋葱形架构 - -!
好吧我不清楚是谁借鉴谁的, ring 彷佛要早一点, 毕竟是 Java工具

https://github.com/boot-clj/boot/wiki/Tasks

Boot adopts a model based on another architecture that has proven to be flexible, powerful, and modular in demanding real-world use: Ring middleware.

因此写过服务器的同窗对这种东西应该比我熟悉了, 自行想象

boot 当中用 fileset 来表示文件, 数据类型是 Set, 集合.
具体在文档有示例, 主要是文件信息, 倒没有把文件带进来
我看现成的插件上总使用临时目录来处理中间过程, 感受就跟我写变量同样随意
fileset 是基于不可变数据的, 不能修改, 只是经过函数返回新的数据
可是临时文件是能够操做的, 大量的文件复写操做.
一个不做任何事情的 task 写起来是这样的, 注意 next-task 这个中间件的写法:

(deftask null-task
  "Does nothing."
  []
  (fn [next-task]
    (fn [fileset]
      (next-task fileset))))

我写的生成 HTML 的 task, 思路大概是这样的:

  • 从 task 的参数当中获取配置信息

  • 从 filset 当中读取对应的文件

  • 生成临时目录, 把个人 HTML 写进临时目录

  • boot/add-resource 方法把临时目录进入到 fileset

  • boot/commit! 方法把文件从 fileset 写到 target/ 目录当中

它的参数自定义了一套 DSL, 有点繁琐, 须要照着现成的例子结合文档看
另外 fileset 操做方法不少, 我尚未掌握几个, 略复杂

task

关于编译 cljs 以及代码热替换的事情, 能够看下这两篇:
https://github.com/magomimmo/modern-cljs/blob/master/doc/second-edition/tutorial-01.md
https://github.com/magomimmo/modern-cljs/blob/master/doc/second-edition/tutorial-02.md
说实在的, 配置这么写, 真的已经到了 Gulp 编译 CoffeeScript 的程度了
并且, 热替换就这么容易搞定了... 只是替换一下资源就行了

很少解释了, 贴一个我练习时用的配置. 不能直接用, 我主要想说明真的很短:

(set-env!
 :source-paths #{"src/cljs"} ; 源代码目录

 :dependencies '[[adzerk/boot-cljs "1.7.170-3"] ; 依赖, 跳过
                 [adzerk/boot-reload "0.4.6"]
                 [mvc-works/boot-html-entry "0.1.1" :scope "provided"]
                 [cirru/boot-cirru-sepal "0.1.1"    :scope "provided"]])

(require '[adzerk.boot-cljs :refer [cljs]] ; 依赖的引用, 跳过
         '[adzerk.boot-reload :refer [reload]]
         '[html-entry.core :refer [html-entry]]
         '[cirru-sepal.core :refer [cirru-sepal]])

(deftask build []
  (comp
    (cljs :optimizations :advanced))) ; 编译, 就这么短!

(deftask dev []
  (comp
    (cirru-sepal :paths ["cirru-src"] :watch true) ; Cirru, 个人, 跳过
    (watch) ; 内建的 watch task
    (reload :on-jsload 'modern-cljs.core/on-jsload) ; reload 就这么写了
    (cljs))) ; 也是 cljs 编译

(defn html-dsl [] ; 个人 HTML 内容
  [:div "demo"])

(deftask gen-html []
  (html-entry :dsl (html-dsl) :html-name "entry.html")) ; 个人 HTML task

并且出于两个缘由, 一个是没有同文件流不须要写 pipe,
另外一是 Clojure 语法抽象程度高, 这个配置的代码量实际上比 Gulp 还少, 除了括号多

社区

也算是准备比较充分了, 一个构建工具, 各类反馈渠道已经搭建好了
Duscourse http://hoplon.discoursehosting.net/
Slack https://clojurians.slack.com/messages/boot/
IRC 也有, 但估计没有人, 我昨天发了两次问题都没人理我
不过 Slack 上反应很快, 当时有个报错, 贴了配置就帮忙找到问题了

顺带看 Slack 的时候以为挺惊人的, Clojure 的 Slack 上分组不少
基本上天天都有大量的消息, 并且比起 IRC 也活跃不少
我扫了一下聊天记录, 某些社区大牛也是混在 Slack 上的, 难能难得
国内 Clojure 也就 QQ 群上你们热闹热闹, 然而水得也挺多的

想一想 boot 做者那帮人也挺牛逼的, 能把这样的东西设计实现出来国内不多有能把这种程度的平台给搞出来的人, FIS 好像挺牛逼可是没那么开放以前 seajs 看着厉害, 后面 Webpack 一来彷佛也趴下了我朋友作打包工具但如今看状况也就是追赶 Webpack 的份, 跟国外不能比要提升社区总体效率, 显然是要统一成限定的几个方案, 而后集中力量但我很不以为国内 Web 开发社区有这个实力能够把开发工具链给统一块儿来.. 观望

相关文章
相关标签/搜索