介绍
为方便公司各个产品h5活动页开发,减少直接复制粘贴代码而产生没有的代码和其它问题,开发此cli工具,目前功能较为简单,其它功能正在开发中,请根据自己需要,决定是否使用。
B612 CLI 是一个基于 vue cli进行快速开发的工具,提供:
- 通过
@b612/cli
实现的交互式的项目脚手架。 - 零配置原型开发。
- 支持多模板项目生成(目前只有一个模板)
安装
Node 版本要求 B612 CLI 需要 Node.js 8.9 或更高版本 (推荐 8.11.0+)。你可以使用 nvm 或 nvm-windows 在同一台电脑中管理多个 Node 版本。
可以使用下列任一命令安装这个新的包:
npm install -g @b612/cli
# OR
yarn global add @b612/cli
安装之后,你就可以在命令行中访问 b612
命令。你可以通过简单运行 b612
,看看是否展示出了一份所有可用命令的帮助信息,来验证它是否安装成功。
你还可以用这个命令来检查其版本是否正确:
b612
基础
创建一个项目
运行以下命令来创建一个新项目:
b612 init my-project default
my-project
是我们要创建项目的名字,default
是项目使用模板的名字,默认使用default
模板
会依次提示输入以下信息
请输入项目名称,默认值 my-project
请输入项目简介,默认值 This is a vue activity project.
请输入作者名称,默认值 git设置的username
请输入作者邮箱,默认值 <username>@yiruikecorp.com
输入git仓库地址,默认值 http://10.35.33.29:9999/<username>/<projectName>.git
,注意请修改成正确的git仓库地址,否则git push会报错
项目文件准备成功后,我们进入项目所在文件夹,并查看生成的文件
cd my-project && ls
然后我们查看README.md
文件,根据文档安装依赖,并运行项目
运行后的效果
开发
1.CLI工具开发
仓库:http://10.35.33.29:9999/dengjianjun/b612-cli.git
代码结构
|-- b612-cli
|-- .editorconfig
|-- .eslintrc.js
|-- .gitignore
|-- README.md
|-- index.js //入口文件,主要逻辑
|-- package.json
|-- lib
|-- download.js
|-- file.js //下载模板
|-- templates.js //模板配置
如需要添加扩展功能,先clone项目,再修改代码,改完后push到git仓库,再发布到公司npm私服仓库http://10.35.46.142:4873
增加模板
目前CLI只有一个模板,可以根据业务需求,为每个产品添加一个模板
// /lib/templates.js
const templates = {
'default': {//模板名字
url: 'http://10.35.33.29:9999/dengjianjun/activityTemplate', //仓库地址
downloadUrl: 'direct:http://10.35.33.29:9999/dengjianjun/activityTemplate.git', //clone地址
description: '默认h5活动页模板' //模板说明
}
}
module.exports = templates
添加新模板,只需要在/lib/templates.js
文件中templates
对象上里添加属性即可,属性名是模板名字,此属性需要3个字段
- url:仓库地址
- downloadUrl:clone代码地址,可以是github.com,gitlab.com,bitbucket.org等网站地址,如果是其它网站地址需要在链接前加
direct:
- description:模板说明,输入命令
b612 list
会显示此模板说明
2.模板开发
default模板
仓库:http://10.35.33.29:9999/dengjianjun/activityTemplate.git
代码结构
|-- activityTemplate
|-- .editorconfig //编辑器配置文件
|-- .env.beta //环境配置文件,如BASE_URL
|-- .env.development
|-- .env.production
|-- .env.staging
|-- .eslintignore
|-- .eslintrc.js
|-- .gitignore
|-- README.md
|-- babel.config.js
|-- package.json
|-- postcss.config.js
|-- vue.config.js //vue cli配置
|-- dist
|-- public
| |-- index.html
|-- src
|-- App.vue
|-- main.js //js 入口文件
|-- assets
| |-- back.png
| |-- index.css
| |-- zaizai_logo.png
|-- components //组件
| |-- Confirm.vue
| |-- Dialog.vue
| |-- Loading.vue
| |-- Toast.vue
|-- views //页面
|-- Home.vue
本模板基于vue cli,主要提供以下功能:
- 通用的项目配置
- 图片压缩
- px转rem
- 打包配置
- vConsole
- Confirm、Dialog、Loading、Toast 4个组件
无任何业务代码,适合所有h5活动,后续还会增加新的功能,也可以自己修改代码push到git仓库
建议package.json
中scripts
命令保持统一
//package.json
"scripts": {
"dev": "vue-cli-service serve", //本地开发,使用开发环境接口
"beta": "vue-cli-service serve --mode beta", //本地开发,使用beta环境接口
"stage": "vue-cli-service serve --mode staging", //本地开发,使用预发环境接口
"prod": "vue-cli-service serve --mode production", //本地开发,使用正式环境接口
"build:beta": "vue-cli-service build --mode beta", //beta环境构建
"build:stage": "vue-cli-service build --mode staging",//预发环境构建
"build:prod": "vue-cli-service build",//正式环境构建
"lint": "vue-cli-service lint"
},
注意这几个地方需要用到模板语法替换,不能写死
//package.json
"name": "{{name}}",
"description": "{{description}}",
"author": "{{author}} <{{mail}}>",
"repository": {
"type": "git",
"url": "{{repository}}"
},
// README.md
# {{name}}
这几个变量就是运行b612 init xxx xxx
时自己输入的内容,对应脚手架项目的index.js
文件中的answers
变量
// b612-cli/index.js
const promptList = [
{
type: 'input',
name: 'name',
message: '请输入项目名称',
default: projectName
},
{
type: 'input',
name: 'description',
message: '请输入项目简介',
default: 'This is a vue activity project.'
},
{
type: 'input',
name: 'author',
message: '请输入作者名称',
default: author
},
{
type: 'input',
name: 'mail',
message: '请输入作者邮箱',
default: `${author}@yiruikecorp.com`
},
{
type: 'input',
name: 'repository',
message: '请输入git仓库地址',
default: repository
}
]
//命令行答询
const answers = await inquirer.prompt(promptList)
const files = ['package.json', 'README.md'];
files.forEach(file => {
//根据命令行答询结果修改对应文件
const filePath = `${projectName}/${file}`;
const packsgeContent = fs.readFileSync(filePath, 'utf8');
const packageResult = handlebars.compile(packsgeContent)(answers);
fs.writeFileSync(filePath, packageResult);
});