ci-task-runner
![Build Status](https://travis-ci.org/aui/ci-task-runner.svg?branch=master)
支持增量与多进程的构建任务调度器。它的职责:
- 观察版本仓库的目录、文件变更
- 调用指定程序来构建变更后的文件,如 Webpack、Gulp、Grunt 等
特性
- 标准:使用 Git 或 Svn 仓库来检测变更
- 快速:利用多核 CPU 多进程并行加速构建
- 灵活:兼容任意构建器或自定义脚本
- 简单:采用语义化的 JSON 文件来描述项目
适用场景
- 前端项目云构建、持续集成
- 多个模块需要单独构建的中大型项目
安装
npm install ci-task-runner -g
使用
1. 切换到项目目录,运行:
ci-task-runner --init
程序会在当前目录创建 .ci-task-runner.json 文件以及演示模块目录(演示依赖 Webpack)。
2. 运行 ci-task-runner
ci-task-runner
在服务器上可以使用 CI 工具启动 ci-task-runner,参考: 持续集成。
配置
.ci-task-runner.json 文件范例:
{
"modules": ["mod1", "mod2", "mod3"],
"assets": "dist/assets.json",
"repository": "git",
"program": "cd ${modulePath} && webpack --color"
}
上述例子中:mod1、mod2、mod3 有变更会执行目录中的 webpack.config.js。
modules
模块列表。模块可以是目录名或文件名。
简写形式:{string[]}
{
"modules": ["mod1", "mod2", "mod3"]
}
对象形式:{Object[]}
{
"modules": [
"mod1",
"mod2",
{
"name": "mod3",
"dependencies": ["common/v1"],
"program": "cd ${modulePath} && gulp"
},
["mod4", "mod5"]
]
}
dependencies
与 program
会继承顶层的配置modules
支持配置并行任务,参考 多进程并行构建
assets
设置构建后文件索引表输出路径。构建任务结束后它会输出结果,以供其他程序调用。参考:集中管理所有构建结果。
请在版本库中忽略 assets
的文件路径。
dependencies
模块外部依赖列表。如果模块目录依赖了目录外的库,可以在此手动指定依赖,这样外部库的更新也可以触发模块构建。
module-watch 使用 Git 或 Svn 来实现变更检测,所以其路径必须已经受版本管理。如果想监控 node_modules 的变更,可以指定:"dependencies": ["package.json"]
。
repository
设置仓库的类型。支持 git 与 svn。
parallel
设置最大并行进程数。默认值为 require('os').cpus().length
。
program
构建器配置。
简写形式:{string}
{
"program": "cd ${modulePath} && node build.js"
}
对象形式:{Object}
{
"program": {
"command": "node build.js",
"options": {
"cwd": "${modulePath}"
}
}
}
program.command
设置执行的构建命令。
程序会将 node_modules/.bin 加入到环境变量 PATH
中。
program.options
构建器进程配置。构建器会在子进程中运行,在这里设置进程的选项。参考:[child_process.exec] (https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback)。
变量
program
支持的字符串变量:
${moduleName}
模块名${modulePath}
模块绝对路径${moduleDirname}
等同于 path.diranme(modulePath)
,详情
配置范例
多进程并行构建
如果模块之间没有依赖,可以开启多进程构建,这样能够充分利用多核 CPU 加速构建。
modules 最外层的模块名是串行运行,如果遇到数组则会并行运行:
{
"modules": ["dll", ["mod1", "mod2", "mod3"]],
"assets": "dist/assets.json",
"repository": "git",
"program": "cd ${modulePath} && webpack --color"
}
上述例子中:当 dll 构建完成后,mod1、mod2、mod3 会以多线程的方式并行构建。
依赖变更触发构建
{
"modules": ["dll", ["mod1", "mod2", "mod3"]],
"dependencies": ["dll", "package.json"],
"assets": "dist/assets.json",
"repository": "git",
"program": "cd ${modulePath} && webpack --color"
}
上述例子中:当 dll 和 package.json 变更后,无论其他模块是否有修改都会被强制构建。
自动更新 Npm 包
{
"modules": [
{
"name": "package.json",
"program": "npm install"
},
"dll",
["mod1", "mod2", "mod3"]
],
"dependencies": ["package.json", "dll"],
"assets": "dist/assets.json",
"repository": "git",
"program": "cd ${modulePath} && webpack --color"
}
上述例子中:当 package.json 变更后,则会执行 npm install
安装项目依赖,让项目保持最新。
集中管理所有构建结果
推荐使用 ci-task-runner 来管理构建输出的资源索引(可选)。
所有任务都成功结束后,各个构建器输出的文件索引将写入在 assets
中,以便发布程序处理这些文件。
Webpack
ci-task-runner 提供了 Webpack 插件来与自己通讯。
var AssetsWebpackPlugin = require('ci-task-runner/plugin/assets-webpack-plugin');
module.exports = {
plugins: [new AssetsWebpackPlugin()]
};
Gulp、Grunt …
手动调用 taskRunner.send()
:
var taskRunner = require('ci-task-runner');
taskRunner.send({
chunks: {
index: '/Document/aui/dist/index.8a2f3bd013c78d30ee09.js'
},
assets: [
'/Document/aui/dist/index.8a2f3bd013c78d30ee09.js',
'/Document/aui/dist/index.8a2f3bd013c78d30ee09.js.map'
]
});
每一个任务只能运行一次 taskRunner.send()
方法,运行后进程将会被强制关闭。
持续集成
使用 CI 工具来在服务器上运行 ci-task-runner。
持续集成优势:
- 自动:分支推送即自动触发构建、测试、发布
- 异步:无须中断编码工作等待构建任务结束
- 稳定:确保构建源都来自于版本仓库中
相关工具:
- gitlab: gitlab-ci
- github: travis
CI 工具配置请参考相应的文档。