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 開發社區有這個實力能夠把開發工具鏈給統一塊兒來.. 觀望

相關文章
相關標籤/搜索