Giter8项目模板制作完全指南

Giter8项目模板制作完全指南

模板授权建议

在创建Giter8模板时,授权方式是一个需要认真考虑的问题。我们强烈推荐使用CC0 1.0授权协议,这是一种类似于"公共领域"的国际通用授权方式,能够完全放弃所有版权及相关权利。

特别需要注意的是,在《伯尔尼公约》覆盖的国家(如美国),版权会自动产生而无需注册。这意味着如果你不为模板声明授权条款,其他人将没有合法权利使用你的模板。即使是宽松的MIT或Apache授权,也会要求使用者在他们的软件中注明模板来源。采用CC0授权可以彻底解决这个问题,让模板代码片段真正成为公共资源。

建议在模板中包含如下授权声明:

模板授权声明
----------------
由<作者姓名> <作者邮箱>于<年份>编写
[其他作者/贡献者信息]

作者已尽可能放弃对此模板的所有版权及相关权利,
将其贡献至全球公共领域。
本模板不提供任何担保。详见CC0 1.0授权协议。

模板目录结构详解

Giter8运行时会在项目中查找两种目录结构来定位模板:

  1. 推荐结构:优先查找src/main/g8目录(src布局)
  2. 备选结构:如果不存在上述目录,则使用项目根目录(root布局)

推荐的src布局

src布局是最佳实践,因为它允许模板本身成为一个标准的sbt项目。这种结构使得开发者可以在推送变更前,使用sbt插件在本地测试模板。

快速创建新模板项目的方法是使用专门为此目的设计的Giter8模板:

g8 foundweekends/giter8.g8

这个命令会创建一个sbt项目,并在src/main/g8下生成模板文件结构。其中default.properties文件用于定义模板字段及其默认值,采用Java属性文件格式。

root布局(实验性)

root布局是一种实验性结构,直接使用GitHub项目的根目录作为模板根目录。由于这种布局下无法在project目录下的文件中使用模板字段,其应用场景非常有限,仅适用于不需要字段替换的非sbt项目模板。

模板属性文件详解

default.properties文件可以放置在project/目录或模板根目录下。这个文件定义了模板中的可替换字段及其默认值。

Giter8使用StringTemplate引擎处理模板,模板字段在源文件中用$字符包围。例如:

class $classname$ {

属性值的动态引用

模板字段可以相互引用,构建更复杂的默认值。例如:

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]:

特殊字符转义

需要显示$符号时,可以使用反斜杠转义:

val foo = "foo"
val bar = "bar"
println(s"\\$foo\\$bar")

输出结果为:

val foo = "foo"
val bar = "bar"
println(s"$foo$bar")

保留字段名限制

某些变量名是StringTemplate语法保留字,不能用作字段名,常见的有:

"i", "i0", "if", "else", "elseif", "endif", "first", "length"
"strlen", "last", "rest", "reverse", "trunc", "strip", "trim"

高级模板功能

模板注释

可以使用特殊语法添加仅对模板维护者可见的注释,这些注释不会出现在生成的输出中:

$! 这个注释不会出现在输出中 !$
// 这个注释会出现在输出中
$!
这个多行注释
同样不会出现
在输出中
!$

条件语句

所有字段都有一个名为truthy的属性,可用于条件表达式。"y""yes""true"会被视为true,其他值则为false

示例:

scala212 = yes
scala211 = no

在模板中使用:

$if(scala212.truthy)$
scalaVersion := "2.12.3"
$elseif(scala211.truthy)$
scalaVersion := "2.11.11"
$else$
scalaVersion := "2.10.6"
$endif$

条件语句也可用于控制文件/目录的包含:

src/main/g8
├── $name__normalize$
│   ├── $if(jvm.truthy)$jvm$endif$
│   │   └── src
│   │       └── main
│   │           └── scala
│   │               └── $organization__packaged$
│   │                   └── $name;format="Camel"$.scala

若要跳过目录但保留其内容,可以使用.作为目录名:

src/main/g8
├── parent_folder
│   ├── $if(cond.truthy)$skip_folder$else$.$endif$
|   |   └── child_file

特殊字段处理

  1. name字段:被视为项目名称,g8运行时会基于此名称创建输出目录(空格和大写字母会被替换)。如果未指定,输出将直接放在当前工作目录。

  2. package字段:被视为源代码包名,$package$会扩展为目录结构(如net.databinder变为net/databinder)。

  3. verbatim字段:定义空格分隔的文件模式(如*.html *.js),匹配的文件将跳过模板处理。

Maven中央仓库集成

Giter8可以直接查询Maven中央仓库获取最新版本号,避免手动更新模板:

unfiltered_version = maven(ws.unfiltered, unfiltered_2.11)

若只需要稳定版(排除里程碑版和候选版):

scalatest_version = maven(org.scalatest, scalatest_2.11, stable)

通过掌握这些功能,你可以创建出功能强大且易于维护的Giter8模板,大大提高项目初始化的效率和一致性。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

翟萌耘Ralph

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值