# futu5 node.js 接入层脚手架代码说明

## 目录说明

```
├── bin 命令文件
│   ├── futu              - 输出当前脚手架版本及帮助信息
│   └── futu-init         - 脚手架生成项目主要命令及逻辑
├── config 配置文件
│   └── index.js          - 配置官方仓库前缀
├── docs
│   ├── 如何写自定义模板.md
│   └── 脚手架方案.md       
├── lib 脚手架自定义方法
│   ├── ask.js            - 将模板配置文件中的 prompts 解析成对应问题并询问
│   ├── download.js       - 下载模板，根据 download-git-repo 基础上支持 http 协议
│   ├── eval.js           - 用于判断某个问题是否需要询问，与当前问题对象的 when 字段相关
│   ├── filter.js         - 结合问题答案删除不需要的文件
│   ├── generate.js       - 生成项目主逻辑！重要
│   ├── git-user.js       - 获取作者 git 信息
│   ├── local-path.js     - 用于判断是否是本地路径、获取本地路径的绝对路径
│   ├── logger.js         - 自定义日志方法：常规log日志、fatal错误日志、success成功日志
│   └── options.js        - 获取模板配置文件对象、向配置对象添加默认问题对象（name）
├── test 单元测试
│   └── e2e  
└── package.json
```


## generate.js

含构建项目主逻辑：

```
获取模板配置对象 -->
初始化 Metalsmith，读取模板文件流-->
为 handlebars 模板注册模板配置对象中定义的 helpers -->
配置对象中是否有 before 函数，有则执行 -->
询问问题 -->
过滤文件 -->
渲染模板文件 -->
配置对象中是否有 after 函数，有则执行 -->
最后构建项目内容 -->
构建完成 -->
成功，若配置对象中有 complete 函数则执行，否则打印配置对象中的 completeMessage 信息
错误，执行回调函数 done(err)
```

主要函数：

* askQuestions: 询问问题
* filterFiles: 过滤文件
* renderTemplateFiles: 渲染模板文件
* logMessage: 用于构建成功时，打印信息


## options.js

主要内容：

1. 获取模板配置文件的配置对象
2. 给配置对象添加默认问题对象 - name（可能存在模板配置对象中无问题询问 package.name 的情况）
3. 读取本地 git 用户相关信息，并初始化 author 字段（package.author）

主要方法：

* getMetadata: 获取 meta.js 或则 meta.json 中的配置信息
* setDefault: 用于向配置对象中添加 name 问题对象
* setValidateName: 为 name 问题对象添加校验函数


## ask.js

主要内容：将 meta.js 或者 meta.json 中的 prompts 字段解析成对应的问题并询问

## filter.js

根 ask.js 收集到的用户的需求删除一些不需要的模板文件。

## logger.js

主要提供三个方法 log（普通日志输出）、fatal（错误日志输出）、success（成功日志输出）
