创建你自己的模板

g8 运行时从给定 Github 项目中的两个位置上寻找模板:

  • 假如存在 src/main/g8 目录就使用 src/main/g8 (src layout)
  • 不存在的话, 就使用根目录作为模板 (root layout)

src layout

推荐使用 src layout, 这样的话很容易使得模板本身也是一个 sbt 项目. 同时在把模板发布到 github 之前可以使用 sbt plugin 插件对模板进行本地的测试.

开始一个新模板项目简单的方法是参考 Giter8 的这个模板的模板:

$ g8 foundweekends/giter8.g8

这会创建一个 sbt 项目, 可以在 src/main/g8 目录下找到基础的模板源文件. default.properties 文件定义了模板的字段以及默认值, 它采用了 Java 属性文件的格式.

default.properties

default.properties 文件可以放在 project/ 目录下, 或者是模板的根目录下. 属性是简单的键值对, 值在应用模板时可被替换.

StringTemplate, 应用于 Scalasti, 是应用 Giter8 模板的引擎, 因此在源文件中的模板字段要用前后两个 $ 字符包裹起来. 例如, 对于 “classname” 字段可能在源文件中的引用方式是这样的:

class $classname$ {

模板字段本身可被其他字段内部引用. 比如, 你可以基于给定的用户 Github id 来声明一些 URL:

name = URL Builder
github_id=githubber
developer_url=https://github.com/$github_id$
project_url=https://github.com/$github_id$/$name;format="norm"$

这会在交互界面下产生如下效果:

name [URL Builder]: my-proj
github_id [githubber]: n8han
project_url [https://github.com/n8han/my-proj]:
developer_url [https://github.com/n8han]:

name 字段

如果定义了 name 字段, 它会被 Giter8 特殊处理. 它被认定为所创建项目的名称, 因此 g8 运行时会基于这个 name (替换了空格和大写字母)创建一个目录用于存放所有模板输出. 倘若 name 字段未在模板中指定, g8 会把输出文件创建在用户当前的工作目录. 在这两种情况下, 输出的文件目录层次关系都会保持与模板源目录中定义的一致. 文件和目录名同样可以使用定义的模板字段, 例如.

src/main/g8/src/main/scala/$classname$.scala

package 字段

如果定义的 package 字段, 它会被作为用户源文件的包名. 在目录名上的 $package$ 会展开为包目录结构. 例如, net.databinder 会生成目录 net/databinder.

verbatim 字段

如果定义了 verbatim 字段, 它被认为是符合模式的以空格分隔的文件名列表, 如 *.html *.js. 匹配 verbatim 模式的文件不会应用模板中定义的字段.

Maven 属性

maven 属性 告知 Giter8 去查询 Maven 中心仓库. 相比于指定一个特定的版本 (这得为每一次发布更新模板), 可以只声明要用的库, giter8 将会根据 Maven 中心仓库设置相应库的最新版本.

这一属性值的格式为 maven(groupId, artifactId). 记住, Scala 项目发布时经常会在构件 id 中注明 Scala 版本标识. 所以对于 Unfiltered 库, 我们可以如下方式指明最新版本号:

name = My Template Project
description = Creates a giter8 project template.
unfiltered_version = maven(net.databinder, unfiltered_2.11)

root layout

尚处在试难中的布局方式叫做 root layout, 它直接使用 Github 项目的根目录作为模板的根目录.

由于你不能再在 project 下的文件应用模板字段, 所以这种布局应用方式有很大的局限性. 它也许不需要用于 sbt 来构建的模板, 或不包含任何字段的模板有用处.

格式化模板字段

Giter8 对于格式化模板字段有内置的支持. 当引用字段时可加入格式化选项. 例如, name 字段可用如下方法格式为大写字母开始的驼峰形式:

$name;format="Camel"$

格式化选项有:

upper    | uppercase       : all uppercase letters
lower    | lowercase       : all lowercase letters
cap      | capitalize      : uppercase first letter
decap    | decapitalize    : lowercase first letter
start    | start-case      : uppercase the first letter of each word
word     | word-only       : remove all non-word letters (only a-zA-Z0-9_)
Camel    | upper-camel     : upper camel case (start-case, word-only)
camel    | lower-camel     : lower camel case (start-case, word-only, decapitalize)
hyphen   | hyphenate       : replace spaces with hyphens
norm     | normalize       : all lowercase with hyphens (lowercase, hyphenate)
snake    | snake-case      : replace spaces and dots with underscores
packaged | package-dir     : replace dots with slashes (net.databinder -> net/databinder)
random   | generate-random : appends random characters to the given string

一个值为 My Projectname 字段可用如下方式渲染为:

$name$ -> "My Project"
$name;format="camel"$ -> "myProject"
$name;format="Camel"$ -> "MyProject"
$name;format="normalize"$ -> "my-project"
$name;format="lower,hyphen"$ -> "my-project"

注, 可同时指定多个格式化选项 (逗号分隔), 它们以给定的顺序依次应用.

对于文件或目录名中的字段, 可通过在字段名后加双下划线来指定格式化选项. 例如, 目录名为 $organization__packaged$ 的话会转换 org.somewhereorg/somewhere, 就像是内建的对 package 字段支持那样. 文件名为 $name__Camel$.scala, 且 name awesome project 的话, 将会创建文件 AwesomeProject.scala.

本地测试模板

模板可通过 file:// 协议形式的 URL 传递给 g8, 这时保存存在文件系统中的模板能被使用. 带上 --force 选项会在无提示的情况下覆盖文件输出, 你可借以测试对模板的修改.

比如, 倘若你已把 Unfiltered 模板克隆到了本地, 就可以运行如下命令:

$ g8 file://unfiltered.g8/ --name=uftest --force

在另一个终端中, 测试模板的输出.

$ cd uftest/
$ sbt
> ~ compile

修改模板, 保存在 .g8 下的模板源目录中, 然后回到前一个终端运行命令来难模板:

$ g8 file://unfiltered.g8/ --name=uftest --force

在你的 uftest sbt 会话中, ~ compile 命令处于等待状态, 一旦发现有文件修改就会自动重新编译.

使用 Giter8Plugin

Giter8 提供了一个 sbt 插件用于在推送模板到 Github 分支之前进行测试. 如果你使用上面推荐的 foundweekends/giter8.g8 模板, 它应该已经这样配置好了的.

如果你需要为已有的模板项目升级使用这个插件, 你可以在 project/giter8.sbt 中加上如下依赖:

addSbtPlugin("org.foundweekends.giter8" % "sbt-giter8" % "0.7.1")

当你配置了使用该插件, 并从该模板工程目录进到 sbt 控制台后, 就可以运行 g8Test 来应用模板, 默认的输出是在 target/sbt-test 目录下, 并且针对那个项目在新 forked 进程中运行 scripted 测试. 你可以通过 project/giter8.testsrc/test/g8/test 来进行 scripted 测试, 不然就会调用 >test. 采用一个 sbt 项目是一个很好的模板的健壮性检查.

但是, 假如你的模板不是一个 sbt 项目会如何呢?

project/default.properties
TodaysMenu.html

你仍然可以使用 sbt 控制台来测试模板. 基本的 g8 行为将会对模板应用默认的字段值并写入到相同的 target/g8 目录中.

只要你把模板推送到了 Github (记往项目名必须以 .g8 结尾), 你就可以用真实的 g8 进行测试. 当你已准备好了, 把你的模板项目加到 wiki 页面上, 这样别的 giter8 用户就能找到它.

results matching ""

    No results matching ""