狗好看の世界

Less words, more attempting.

Leiningen 模板的创建

创建模板

使用和创建Clojure项目类似的方式来创建模板, 不同的地方就是为了创建模板, 你需要使用一个叫做 template 的模板.

lein new template your-template-name

如果创建了一个island的模板, 使用下面的命令

lein new template island

创建成功, 会得到下面的信息. create_template_succeed.png lein-newnew的文档中, 使用了 --to-dir 的参数, 来指定项目目录的名字. 这并不是必须的, 只在需要指定文件夹名称的时候使用即可.

模板的结构

dir_tree.png

project.clj - 这个文件和普通的项目中的一样, 除了项目的名字后面多了一个 /lein-template. 这个后缀使得leiningen能在 Clojars 上面找到他.

source/leiningen/new/island.clj - 定义了项目如何通过这个模板创建. 比如说定义哪些文件是通过模板创建的, 和如何创建.

resources/leiningen/new/island/ - 这个是你放源码和项目文件的地方, 动态的在源码中嵌入项目名称可以通过特定的标签来实现.

设置模板中的一些定义

我的模板需要一个自定义的 project.clj 文件, 所以我编辑 src/leiningen/new/island.clj 来生成一些文件. 我的模板一共要生成三个文件:

  • project.clj
  • src/server/island/core.clj
  • src/client/island/core.cljs
(ns leiningen.new.island
  (:require [leiningen.new.templates :refer [renderer name-to-path ->files]]
            [leiningen.core.main :as main]))

(def render (renderer "island"))

(defn island
  "Generate a simple project"
  [name]
  (let [data {:name name
              :sanitized (name-to-path name)}]
    (main/info "Generating fresh 'lein new' island project.")
    (->files data
             ["project.clj" (render "project.clj" data)]
             ["src/server/{{sanitized}}/core.clj" (render "core.clj" data)]
             ["src/client/{{sanitized}}/core.cljs" (render "core.cljs" data)])))

先把当前项目中的 project.clj 复制到 resources/leiningen/new/island/ 下面. 然后编写这三个文件.

为模板中添加占位符

你需要在模板文件中指定一些占位符, 用来在使用 lein new island my-new-project 生成项目的时候, 注入正确的内容. 模板文件 resources/leiningen/new/island/project.clj 加入一些代表项目名称的占位符. 编辑这个文件:

(defproject {{name}} "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.7.0"]
                 [org.clojure/clojurescript "1.7.170"]
                 [org.clojure/core.async "0.2.374"
                  :exclusions [org.clojure/tools.reader]]
                 [datascript "0.15.0"]
                 [cljsjs/react "0.14.3-0"]
                 [cljsjs/react-dom "0.14.3-1"]
                 [sablono "0.6.2"]
                 [org.omcljs/om "1.0.0-alpha30"]
                 [org.danielsz/system "0.3.0-SNAPSHOT"]
                 [hiccup "1.0.5"]
                 [http-kit "2.1.19"]
                 [com.taoensso/sente "1.7.0"]
                 [com.datomic/datomic-free "0.9.5206"
                  :exclusions [joda-time]]
                 [compojure "1.4.0"]]

  :plugins [[lein-cljsbuild "1.1.2"
             :exclusions [org.clojure/clojure]]]

  :source-paths ["src/server"]

  :clean-targets ^{:protect false} ["resources/public/js" "target"]

  :figwheel
  {:http-server-port 3449
   :http-server-root "public"
   :ring-handler {{name}}.core/app}

  :cljsbuild
  {:builds
   [{:id "dev"
     :source-paths ["src/client"]
     :figwheel true
     :compiler {:main {{name}}.core
                :asset-path "js/out"
                :output-to "resources/public/js/app.js"
                :output-dir "resources/public/js/out"}}]})

{{name}} 会被替换成项目的名字.

这个是 resources/leiningen/new/island/core.clj:

(ns {{name}}.core)

(defn foo []
  (println "Hello, World"))

这个是 resources/leiningen/new/island/core.cljs

(ns {{name}}.core
    (:require))

(enable-console-print!)

测试模板

如果要测试模板的效果, 首先用下面的命令, 将模板打包成一个 .jar.

lein jar

现在可以进入 target 目录下面, 使用leiningen创建新项目.

cd target
lein new my-new-project

当你进入 target 目录后, jar文件会处于你的Java的CLASSPATH中. 所以对于leiningen可以使用它.

安装你的模板

如果觉得爽了, 就可以安装到maven的本地仓库了. 在项目的根目录下面. 之后就可以在任何地方使用这个模板了, 需要注意的是, leiningen当前的版本下, 不允许使用 SNAPSHOT 版本的模板. 所以需要先将模板项目(例子中的island)的 project.clj 中的版本号的后缀 -SNAPSHOT 去掉.

(defproject island/lein-template "0.1.0" ;; 去掉 -SNAPSHOT
  ... )

之后执行:

lein install

使用本地仓库中的模板

lein new island my-new-project

发布模板

未完待续...

Comments