模板项目目录结构
powershell
custom-fastify # ① 模板项目根目录
|-- metadata.js # ② 模板项目配置文件
`-- {{ projectName }} # ③ 模板根目录
|-- Funfile
|-- README.md
|-- bin
|-- bootstrap
|-- package.json
|-- src
|-- template.yml
`-- test
1234567891011
目录结构说明:
- ① 模板项目根目录:如果模板项目需要上传到 github,则模板项目名称就是仓库名称
- ② 模板项目配置文件:模板项目配置文件不是必须的,支持两种类型的文件:metadata.json 和 metadata.js
- ③ 模板根目录:
fun init
会从模板根目录开始渲染输出,该目录必须是一个模板表达式。projectName
模板变量来自fun init --name foo
的--name
参数。绝大多数场景,模板根目录叫{{ projectName }}
即可
模板项目配置文件
js
module.exports = {
// ① 模板项目名称
"name": "custom-fastify",
// ② 模板项目描述
"description": "Fastify template for Custom Runtime",
// ③ 隐式变量
"vars": {
"service": "{{ projectName }}",
"removeLines": str => str.replace(/^\s*$(?:\r\n?|\n)/gm, '')
},
// ④ 提示输入变量(显式变量)
"userPrompt": [
{
"type": "confirm", // ⑤ 提示输入类型
"name": "httpTrigger", // ⑥ 模板变量名
"message": "Http Trigger?", // ⑦ 提示信息
"default": true // ⑧ 模板变量默认值
},
{
"type": "confirm",
"name": "customDomain",
"message": "Custom domain?",
"default": true
}
],
"copyOnlyPaths": [ "test" ], // ⑨ 设置某些目录和文件不需要渲染,只是简单的拷贝
"ignorePaths": [ "*.log" ] // ⑩ 拷贝时忽略某些目录和文件
}
12345678910111213141516171819202122232425262728
配置文件说明:
- ① 模板项目名称:对模板项目简单介绍
- ② 模板项目描述:对模板项目详细介绍
- ③ 隐式变量:相对显式变量而言,隐式变量不提示用户输入,可以通过
fun init --var baz=xxx
覆盖配置文件的隐式变量,如果显式和隐式有相同的变量,则该变量不会再提示用户输入,但是这种方式是不推荐使用的,也不要依赖此特性,即显式变量和隐式变量不要有交叉 - ④ 提示输入变量(显式变量):在用户初始化模板项目的时候,会显式提示用户输入模板变量,底层用的是 Inquirer,⑤、⑥、⑦和⑧ 详情可以参考: Inquirer 文档。当通过
fun init --var foo=xxx
设置了foo
变量后,则不会再提示用户输入foo
变量的值,其他没有设置过的显式变量仍然提示输入 - ⑨ 设置某些目录和文件不需要渲染,只是简单的拷贝:比如一些二进制文件。格式和
gitignore
是一样的,具体可以参考:gitignore 规范 - ⑩ 拷贝时忽略某些目录和文件:格式和
gitignore
是一样的,具体可以参考:gitignore 规范 - 配置文件也可以使用变量,其中,
projectName
模板变量来自fun init --name foo
的--name
参数,还可以使用fun init --var abc=xxx
中的abc
变量,但是,如果你不通过--var
传abc
变量,在渲染配置文件的时候,可能报变量未定义的错误,可以在使用的时候先判断一下,如:{{ typeof x === 'undefined' ? '' : x}}
支持模板语法的位置
- 模板项目配置文件
- 模板根目录
- 模板根目录下的子目录名称(支持多层嵌套)
- 模板根目录下的文件名称(支持多层嵌套)
- 模板根目录下的文件内容(支持多层嵌套)
模板变量设置方式
有三种种方式设置模板变量:
- 参数设置。通过
-V,--var
参数设置模板变量 - 显式变量。配置文件中的
userPrompt
- 隐式变量。配置文件中的
vars
优先级:参数设置 > 隐式变量。
优先级:显式变量 > 隐式变量。
说明:参数设置和显示变量互斥出现,优先级比较没有意义。
模板语法
模板渲染底层是基于 lodash ,详情请参考:lodash 文档。
主要用法:
-
模板表达式
模板表达式的正则表达式规则:/{{([\s\S]+?)}}/g
,以{{
开头,}}
结尾,中间可以是任意字符。# 假设 foo = 'bar' hello {{ foo }}! 输出:hello bar! {{ foo === 'bar' }} 输出:true {{ foo ? foo :'unknown' }} 输出:bar
1234 -
模板代码
模板代码的正则表达式规则:/<%([\s\S]+?)%>/g
,以<%
开头,%>
结尾,中间可以是任意字符。<% if (foo === 'bar') { %> xxxxxxxxx <% } %>
1
小结
自定义模板,支持通过配置文件定义渲染规则,模板引擎根据渲染规则渲染模板项目。其中,模板引擎支持模板表达式和模板代码,我们可以通过命令行参数和提示输入方式传递模板变量。
评论 (0)