|
|
|
|
@ -1,5 +1,9 @@
|
|
|
|
|
// 将一个函数作为模块的导出内容,这个函数接收 `grunt` 对象作为参数,`grunt` 是 Grunt 构建工具的核心对象,
|
|
|
|
|
// 通常用于配置任务、加载插件以及执行各种构建相关的操作,在这里的函数内部会基于 `grunt` 进行一系列任务的配置和定义。
|
|
|
|
|
module.exports = function (grunt) {
|
|
|
|
|
// 定义 `runNpmScript` 函数,用于运行 `npm` 脚本命令,它接收要执行的 `npm` 脚本命令名称(`command`)以及一个回调函数(`cb`)作为参数。
|
|
|
|
|
function runNpmScript (command, cb) {
|
|
|
|
|
// 配置执行 `npm` 脚本的相关选项,创建一个包含 `cmd`(要执行的命令,这里固定为 `npm`)、`args`(传递给 `npm` 命令的参数数组,这里包含 `run` 和具体的脚本命令名称)以及 `opts`(执行命令的其他选项,这里设置 `stdio` 为 `inherit`,表示继承父进程的标准输入、输出和错误输出流,使得执行过程中的信息能直接在终端显示)的对象 `opts`。
|
|
|
|
|
var opts = {
|
|
|
|
|
cmd: 'npm',
|
|
|
|
|
args: ['run', command],
|
|
|
|
|
@ -8,18 +12,26 @@ module.exports = function (grunt) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 使用 `grunt.util.spawn` 方法来启动一个子进程执行配置好的 `npm` 命令,该方法会异步执行命令并在执行完成后触发回调函数,回调函数接收 `error`(执行过程中出现的错误对象,如果没有错误则为 `null`)、`result`(命令执行的结果信息,具体内容根据命令而定)以及 `code`(命令的退出状态码)作为参数。
|
|
|
|
|
grunt.util.spawn(opts, function (error, result, code) {
|
|
|
|
|
// 如果执行过程中出现错误(即 `error` 不为 `null`),则使用 `grunt.fail.warn` 方法向终端输出警告信息,提示指定的 `npm` 脚本命令执行失败,并显示命令名称。
|
|
|
|
|
if (error) {
|
|
|
|
|
grunt.fail.warn(command + ' failed.')
|
|
|
|
|
grunt.fail.warn(command +'failed.')
|
|
|
|
|
}
|
|
|
|
|
// 无论命令执行是否成功,都执行传入的回调函数 `cb`,以便外部在调用 `runNpmScript` 函数后能根据需要进行后续的操作,比如继续执行其他任务等。
|
|
|
|
|
cb()
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 定义一个数组,包含了在某些任务执行时默认自动启动的浏览器名称列表,这里列出了 `Chrome`、`Firefox` 和 `Safari`,
|
|
|
|
|
// 用于后续配置如测试任务等在哪些浏览器中运行的相关设置。
|
|
|
|
|
var autoStartBrowsers = ['Chrome', 'Firefox', 'Safari']
|
|
|
|
|
|
|
|
|
|
// 定义一个常量,表示 HTTP 协议下的流数据源端口号,用于在相关任务(如测试等)中与服务器进行通信等操作时指定端口,这里设置为 `4567`。
|
|
|
|
|
var STREAM_SOURCE_PORT_HTTP = 4567
|
|
|
|
|
|
|
|
|
|
// 定义一个数组,包含了触发 Karma 测试任务的文件路径匹配模式,这些文件的变更通常会触发相应的测试任务重新执行,
|
|
|
|
|
// 例如 `src` 目录下所有子目录中的 `.js` 文件、`test/specs` 目录下的 `.spec.js` 文件等,方便在监听文件变化并自动运行测试的场景下确定哪些文件的变化需要关注。
|
|
|
|
|
var FILES_TRIGGERING_KARMA = [
|
|
|
|
|
'src/**/*.js',
|
|
|
|
|
'test/specs/*.spec.js',
|
|
|
|
|
@ -27,13 +39,22 @@ module.exports = function (grunt) {
|
|
|
|
|
'test/*.js'
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
// 使用 `grunt.initConfig` 方法来初始化 Grunt 的配置对象,在这个对象中可以定义各种任务的配置参数、文件路径等信息,
|
|
|
|
|
// 后续加载的 Grunt 插件以及自定义的任务都会根据这里的配置来执行相应的操作。
|
|
|
|
|
grunt.initConfig({
|
|
|
|
|
|
|
|
|
|
// 读取项目根目录下 `package.json` 文件的内容,并将其解析为 JSON 对象后赋值给 `pkg` 属性,这样在后续配置中可以方便地引用项目的元信息,比如项目名称、版本号等,例如在生成文件名时可以包含版本号等信息。
|
|
|
|
|
pkg: grunt.file.readJSON('package.json'),
|
|
|
|
|
|
|
|
|
|
// 配置 `clean` 任务的参数,这里指定要清理的文件路径模式,即 `dist` 目录下所有的 `.js` 文件以及 `build` 目录下所有的 `.js` 文件,
|
|
|
|
|
// 通常用于在构建之前清理之前生成的旧文件,保证构建环境的干净。
|
|
|
|
|
clean: ['dist/*.js', 'build/*.js'],
|
|
|
|
|
|
|
|
|
|
// 配置 `karma` 任务的相关参数,`karma` 通常用于在不同浏览器中运行 JavaScript 测试用例,这里定义了多个不同的配置选项和子任务配置。
|
|
|
|
|
karma: {
|
|
|
|
|
// 通用的 `karma` 任务选项,适用于所有 `karma` 子任务(除非子任务中单独覆盖这些配置),例如设置 `singleRun` 为 `true` 表示只运行一次测试然后退出,
|
|
|
|
|
// 设置 `proxies` 用于配置代理,将 `/testServer` 代理到 `http://localhost:` + `STREAM_SOURCE_PORT_HTTP`,方便在测试中访问特定的服务器资源,
|
|
|
|
|
// 配置 `reporters` 为 `['progress']` 表示使用进度条形式的测试结果报告器,`colors` 为 `true` 表示在输出的报告和日志中启用颜色显示,使输出更直观易读。
|
|
|
|
|
options: {
|
|
|
|
|
singleRun: true,
|
|
|
|
|
proxies: {
|
|
|
|
|
@ -47,6 +68,9 @@ module.exports = function (grunt) {
|
|
|
|
|
colors: true
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// `coverage` 子任务配置,用于生成测试覆盖率报告,设置 `reporters` 为 `['coverage']` 表示使用覆盖率报告器,
|
|
|
|
|
// 配置 `preprocessors` 来指定哪些源文件需要生成覆盖率信息(这里是 `src` 目录下所有子目录中的 `.js` 文件,这些文件会被 Istanbul 工具进行插桩处理以收集覆盖率数据),
|
|
|
|
|
// 指定 `browsers` 为 `['PhantomJS']` 表示在 PhantomJS 浏览器中运行测试,`configFile` 为 `test/unit.conf.js` 表示使用该配置文件来进一步配置 Karma 任务的详细参数。
|
|
|
|
|
'coverage': {
|
|
|
|
|
reporters: ['coverage'],
|
|
|
|
|
preprocessors: {
|
|
|
|
|
@ -58,6 +82,9 @@ module.exports = function (grunt) {
|
|
|
|
|
configFile: 'test/unit.conf.js'
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// `precaptured-dev` 子任务配置,用于在开发过程中针对已经捕获的浏览器(可能是之前手动启动或者通过其他方式准备好的浏览器环境)进行单次测试运行,
|
|
|
|
|
// 适用于在一些特殊情况下(如在 Unix 开发环境中要在 Windows VM 里运行的 IE 浏览器等 Karma 不容易直接启动的浏览器环境)运行测试,这里 `browsers` 设为空数组表示使用已捕获的浏览器,
|
|
|
|
|
// `configFile` 为 `test/unit.conf.js`,`singleRun` 设为 `true` 表示单次运行测试。
|
|
|
|
|
'precaptured-dev': {
|
|
|
|
|
// for doing a single test run with already captured browsers during development.
|
|
|
|
|
// this is good for running tests in browsers karma can't easily start such as
|
|
|
|
|
@ -67,31 +94,44 @@ module.exports = function (grunt) {
|
|
|
|
|
singleRun: 'true'
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// `single-dev` 子任务配置,用于在开发过程中在默认自动启动的浏览器(前面定义的 `autoStartBrowsers` 数组中的浏览器)中运行测试,
|
|
|
|
|
// `configFile` 为 `test/unit.conf.js`,表示使用该配置文件来配置详细的测试参数。
|
|
|
|
|
'single-dev': {
|
|
|
|
|
browsers: autoStartBrowsers,
|
|
|
|
|
configFile: 'test/unit.conf.js'
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// `single-concat` 子任务配置,类似 `single-dev`,也是在默认自动启动的浏览器中运行测试,但使用 `test/concat.conf.js` 作为配置文件,
|
|
|
|
|
// 可能在这个配置文件中定义了与文件合并(concat)相关的测试特定设置,具体配置取决于该文件内容。
|
|
|
|
|
'single-concat': {
|
|
|
|
|
browsers: autoStartBrowsers,
|
|
|
|
|
configFile: 'test/concat.conf.js'
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// `single-minified` 子任务配置,同样在默认自动启动的浏览器中运行测试,不过使用 `test/min.conf.js` 作为配置文件,
|
|
|
|
|
// 可能该配置文件针对测试已经压缩(minified)后的代码进行了相应的配置,用于验证压缩后代码的测试情况等。
|
|
|
|
|
'single-minified': {
|
|
|
|
|
browsers: autoStartBrowsers,
|
|
|
|
|
configFile: 'test/min.conf.js'
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// `single-amd` 子任务配置,在默认自动启动的浏览器中运行测试,使用 `test/amd.conf.js` 作为配置文件,
|
|
|
|
|
// 也许这个配置文件是针对使用 AMD(Asynchronous Module Definition,异步模块定义)规范的代码进行测试相关的设置,用于测试遵循 AMD 规范的模块情况。
|
|
|
|
|
'single-amd': {
|
|
|
|
|
browsers: autoStartBrowsers,
|
|
|
|
|
configFile: 'test/amd.conf.js'
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// `single-browser-http` 子任务配置,在默认自动启动的浏览器中运行测试,使用 `test/http.conf.js` 作为配置文件,
|
|
|
|
|
// 推测该配置文件与基于 HTTP 协议相关的测试场景或者配置有联系,用于特定的 HTTP 相关的测试需求。
|
|
|
|
|
'single-browser-http': {
|
|
|
|
|
browsers: autoStartBrowsers,
|
|
|
|
|
configFile: 'test/http.conf.js'
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// `persist` 子任务配置,用于设置一个持久化的 Karma 服务器,`singleRun` 设为 `false` 表示服务器启动后不会自动运行一次测试就关闭,而是持续运行等待后续指令,
|
|
|
|
|
// `background` 设为 `true` 表示在后台运行服务器,`browsers` 设为空数组可能表示初始启动时不指定具体浏览器,后续可以通过其他方式添加浏览器来运行测试,
|
|
|
|
|
// `configFile` 为 `test/unit.conf.js`,表示使用该配置文件来配置服务器的基本参数,通过 `karma:persist` 任务可以启动这个服务器,通过 `karma:persist:run` 任务可以在已启动的服务器上运行测试。
|
|
|
|
|
'persist': {
|
|
|
|
|
// for setting up a persistent karma server.
|
|
|
|
|
// To start the server, the task is:
|
|
|
|
|
@ -104,39 +144,56 @@ module.exports = function (grunt) {
|
|
|
|
|
background: true
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// `single-heap` 子任务配置,使用 `test/heap.conf.js` 作为配置文件来运行测试,具体配置取决于该配置文件内容,可能与内存堆(heap)相关的测试场景或者设置有关系。
|
|
|
|
|
'single-heap': {
|
|
|
|
|
configFile: 'test/heap.conf.js'
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// 配置 `exec` 任务的相关参数,`exec` 任务通常用于在 Grunt 构建过程中执行外部命令,这里定义了多个不同的命令配置,每个配置对应一个子任务。
|
|
|
|
|
exec: {
|
|
|
|
|
// `reportMinifiedSize` 子任务配置,执行一个命令用于报告压缩后的文件大小,通过 `echo` 命令输出 `minified size is` 以及使用 `wc -c` 命令统计 `dist/oboe-browser.min.js` 文件的字节数,
|
|
|
|
|
// 这里的命令在 Windows 系统下可能不太适用(注释中也提到了,建议使用 Cygwin),因为 `wc` 等命令是类 Unix 系统下常用的文本处理命令。
|
|
|
|
|
// these might not go too well on Windows :-) - get Cygwin.
|
|
|
|
|
reportMinifiedSize: {
|
|
|
|
|
command: 'echo minified size is `wc -c < dist/oboe-browser.min.js` bytes'
|
|
|
|
|
},
|
|
|
|
|
// `reportMinifiedAndGzippedSize` 子任务配置,执行一个命令用于报告压缩并经过 `gzip` 处理后的文件大小,通过 `echo` 命令输出 `Size after gzip is` 以及使用 `gzip --best --stdout` 对 `dist/oboe-browser.min.js` 文件进行最佳压缩并输出到标准输出,
|
|
|
|
|
// 再通过 `wc -c` 命令统计输出内容的字节数,最后显示字节数并提示最大值为 `5120`,同样这个命令在 Windows 系统下可能需要特殊处理(如借助 Cygwin 等工具)才能正确执行。
|
|
|
|
|
reportMinifiedAndGzippedSize: {
|
|
|
|
|
command: 'echo Size after gzip is `gzip --best --stdout dist/oboe-browser.min.js | wc -c` bytes - max 5120'
|
|
|
|
|
},
|
|
|
|
|
// `createGitVersionJs` 子任务配置,执行一个命令用于创建一个包含 Git 版本描述信息的文件,通过 `echo` 命令将 `git describe` 执行的结果(获取当前 Git 仓库的版本描述信息)输出到 `build/version.txt` 文件中,用于记录项目的版本相关信息。
|
|
|
|
|
createGitVersionJs: {
|
|
|
|
|
command: 'echo "`git describe`" > build/version.txt'
|
|
|
|
|
},
|
|
|
|
|
// `webpackBrowser` 子任务配置,执行 `npm run webpack` 命令,通常用于启动 Webpack 构建任务来处理浏览器相关的代码,比如打包、编译等操作,具体 Webpack 的配置取决于项目中 `webpack` 脚本对应的配置。
|
|
|
|
|
webpackBrowser: {
|
|
|
|
|
command: 'npm run webpack'
|
|
|
|
|
},
|
|
|
|
|
// `webpackNode` 子任务配置,执行 `npm run webpack -- --config webpack.config.node.js` 命令,同样是启动 Webpack 构建任务,但使用 `webpack.config.node.js` 作为 Webpack 的配置文件,
|
|
|
|
|
// 用于处理 Node.js 相关代码的打包、编译等操作,与处理浏览器代码的 Webpack 配置可能有所不同,例如在模块加载、目标环境等方面会有差异。
|
|
|
|
|
webpackNode: {
|
|
|
|
|
command: 'npm run webpack -- --config webpack.config.node.js'
|
|
|
|
|
},
|
|
|
|
|
// `standard` 子任务配置,执行 `npm run standard -- --fix --envs jasmine` 命令,可能是用于运行代码规范检查工具(如 ESLint 等,这里猜测是 `standard` 相关的工具),
|
|
|
|
|
// 并尝试自动修复代码规范问题(通过 `--fix` 参数),同时设置特定的环境(`--envs jasmine`,可能是针对 Jasmine 测试框架相关的代码环境进行规范检查)。
|
|
|
|
|
standard: {
|
|
|
|
|
command: 'npm run standard -- --fix --envs jasmine'
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// 配置 `watch` 任务的相关参数,`watch` 任务用于监听文件的变化,当指定的文件发生变化时自动触发相应的任务执行,这里定义了多个不同的监听配置,每个配置对应一个子任务。
|
|
|
|
|
watch: {
|
|
|
|
|
// `karma` 子任务配置,监听触发 Karma 测试任务的文件(前面定义的 `FILES_TRIGGERING_KARMA` 中的文件),当这些文件有变化时,执行 `karma:persist:run` 任务,
|
|
|
|
|
// 即运行在持久化 Karma 服务器上的测试任务,实现自动重新运行测试的功能,方便在开发过程中实时查看代码修改对测试结果的影响。
|
|
|
|
|
karma: {
|
|
|
|
|
files: FILES_TRIGGERING_KARMA,
|
|
|
|
|
tasks: ['karma:persist:run']
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// `karmaAndSize` 子任务配置,类似 `watch:karma`,也是监听触发 Karma 测试任务的文件,当文件变化时,执行多个任务,包括 `karma:persist:run`(运行测试)、`browser-build`(推测是与浏览器相关的构建任务,具体内容需看对应任务定义)以及 `dist-sizes`(可能是用于查看生成文件大小相关的任务,具体要看对应任务配置),
|
|
|
|
|
// 这样在开发过程中不仅能自动运行测试,还能查看构建文件大小情况,确保文件大小不会超出预期等。
|
|
|
|
|
// like above but reports the file size. This is good for
|
|
|
|
|
// watching while developing to make sure it doesn't get
|
|
|
|
|
// too big. Doesn't run tests against minified.
|
|
|
|
|
@ -148,101 +205,157 @@ module.exports = function (grunt) {
|
|
|
|
|
'dist-sizes']
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// `testNode` 子任务配置,监听触发 Karma 测试任务的文件,当文件变化时,执行 `node-build` 任务(推测是与 Node.js 相关的构建任务,具体要看对应任务定义),
|
|
|
|
|
// 用于在开发 Node.js 相关代码时,自动触发相应的构建操作,方便及时查看代码修改后的构建效果。
|
|
|
|
|
// like above but reports the file size. This is good for
|
|
|
|
|
// watching while developing to
|
|
|
|
|
|
|
|
|
|
// like above but reports the file size. This is good for
|
|
|
|
|
// watching while developing to make sure it doesn't get
|
|
|
|
|
// too big. Doesn't run tests against minified.
|
|
|
|
|
// `testNode` 子任务配置,用于 `watch` 任务中,监听那些会触发 `Karma` 测试任务的文件(前面已定义 `FILES_TRIGGERING_KARMA` 数组中的文件),
|
|
|
|
|
// 当这些文件发生变化时,会触发执行 `node-build` 任务,该任务可能是针对 Node.js 相关代码进行构建相关操作的任务,具体操作取决于 `node-build` 任务的定义。
|
|
|
|
|
testNode: {
|
|
|
|
|
files: FILES_TRIGGERING_KARMA,
|
|
|
|
|
tasks: [
|
|
|
|
|
'node-build']
|
|
|
|
|
'node-build'
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// `restartStreamSourceAndRunTests` 子任务配置,同样用于 `watch` 任务里。它监听 `test/streamsource.js` 文件的变化,
|
|
|
|
|
// 当该文件改变时,会依次执行 `start-stream-source` 和 `karma:persist:run` 这两个任务。不过当前存在一个问题(注释中提到),
|
|
|
|
|
// 即 `start-stream-source` 任务如果多次运行会失败,因为其占用的端口会被占用(可能每次启动都尝试使用同一个固定端口导致冲突)。
|
|
|
|
|
restartStreamSourceAndRunTests: {
|
|
|
|
|
// 此处注释说明了当前存在的问题,即 `start-stream-source` 任务多次运行会失败,原因是端口被占用。
|
|
|
|
|
// this fails at the moment because start-stream-source
|
|
|
|
|
// fails if run more than once - the port is taken.
|
|
|
|
|
files: ['test/streamsource.js'],
|
|
|
|
|
tasks: ['start-stream-source', 'karma:persist:run']
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// `standard` 子任务配置,用于 `watch` 任务里,监听那些触发 `Karma` 测试任务的文件(`FILES_TRIGGERING_KARMA` 数组中的文件)变化,
|
|
|
|
|
// 一旦这些文件有变动,就会执行 `exec:standard` 任务,这个任务大概率是运行代码规范检查相关的操作(前面 `exec` 任务配置中有相关定义),比如检查代码是否符合特定的代码规范标准,并可能进行自动修复等操作。
|
|
|
|
|
standard: {
|
|
|
|
|
files: FILES_TRIGGERING_KARMA,
|
|
|
|
|
tasks: ['exec:standard']
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
concurrent: {
|
|
|
|
|
watchDev: {
|
|
|
|
|
tasks: [ 'watch:karmaAndSize', 'watch:restartStreamSourceAndRunTests' ],
|
|
|
|
|
options: {
|
|
|
|
|
logConcurrentOutput: true
|
|
|
|
|
// `concurrent` 配置部分,主要用于定义可以同时执行的多个任务组合,这里定义了 `watchDev` 任务配置。
|
|
|
|
|
concurrent: {
|
|
|
|
|
// `watchDev` 任务配置,用于同时运行多个 `watch` 子任务,具体是 `watch:karmaAndSize` 和 `watch:restartStreamSourceAndRunTests` 这两个任务,
|
|
|
|
|
// 通过设置 `logConcurrentOutput` 为 `true`,可以让这些同时执行的任务的输出信息都能正常显示出来,方便查看每个任务的执行情况,
|
|
|
|
|
// 常用于在开发环境下同时监听多个不同类型的文件变化并执行相应的关联任务,提高开发效率。
|
|
|
|
|
watchDev: {
|
|
|
|
|
tasks: [ 'watch:karmaAndSize', 'watch:restartStreamSourceAndRunTests' ],
|
|
|
|
|
options: {
|
|
|
|
|
logConcurrentOutput: true
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
})
|
|
|
|
|
// 初始化 Grunt 配置对象结束的括号,至此完成了对 Grunt 构建任务中如 `clean`、`karma`、`exec`、`watch`、`concurrent` 等多个任务相关配置参数的定义。
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
// 使用 `require('matchdep').filterDev('grunt-*')` 来筛选出开发环境下所有以 `grunt-` 开头的插件,然后通过 `forEach` 方法遍历并调用 `grunt.loadNpmTasks` 函数加载这些插件,
|
|
|
|
|
// 使得这些插件定义的任务可以在 Grunt 构建流程中被使用,方便扩展 Grunt 的功能,添加各种自定义的构建、测试等相关任务。
|
|
|
|
|
require('matchdep').filterDev('grunt-*').forEach(grunt.loadNpmTasks)
|
|
|
|
|
|
|
|
|
|
var streamSource
|
|
|
|
|
// 定义一个变量 `streamSource`,用于后续管理流数据源相关的操作,初始时它未被赋值,具体的赋值和使用在相关任务中进行。
|
|
|
|
|
var streamSource;
|
|
|
|
|
|
|
|
|
|
// 注册一个名为 `start-stream-source` 的 Grunt 任务,这个任务的功能是启动一个流数据源服务,在任务函数内部实现了相关的逻辑来确保服务正确启动。
|
|
|
|
|
grunt.registerTask('start-stream-source', function () {
|
|
|
|
|
grunt.log.ok('do we have a streaming source already?', !!streamSource)
|
|
|
|
|
// 使用 `grunt.log.ok` 方法向控制台输出一条信息,用于检查当前是否已经存在一个流数据源(通过将 `streamSource` 转换为布尔值来判断,若已赋值则表示存在),
|
|
|
|
|
// 主要是为了在启动新的流数据源之前了解当前状态,便于后续做相应处理,比如如果已经存在就先停止它等操作。
|
|
|
|
|
grunt.log.ok('do we have a streaming source already?',!!streamSource);
|
|
|
|
|
|
|
|
|
|
// if we previously loaded the streamsource, stop it to let the new one in:
|
|
|
|
|
// 如果 `streamSource` 已经有值(即之前已经启动过流数据源服务),则执行以下操作,先通过 `grunt.log.ok` 向控制台输出一条提示信息,表示似乎已经存在一个流数据源服务器,
|
|
|
|
|
// 然后调用 `streamSource.stop()` 方法(这里假设 `streamSource` 对象有 `stop` 方法来停止之前的服务)来停止它,以便释放相关资源,为启动新的流数据源服务做准备。
|
|
|
|
|
if (streamSource) {
|
|
|
|
|
grunt.log.ok('there seems to be a streaming server already, let\'s stop it')
|
|
|
|
|
streamSource.stop()
|
|
|
|
|
grunt.log.ok('there seems to be a streaming server already, let\'s stop it');
|
|
|
|
|
streamSource.stop();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
streamSource = require('./test/streamsource.js')
|
|
|
|
|
streamSource.start(STREAM_SOURCE_PORT_HTTP, grunt)
|
|
|
|
|
})
|
|
|
|
|
// 通过 `require` 加载 `./test/streamsource.js` 文件(这个文件应该是定义了流数据源相关的逻辑,比如启动服务的具体实现等),并将返回的对象赋值给 `streamSource` 变量,
|
|
|
|
|
// 然后调用 `streamSource.start` 方法(同样假设该对象有 `start` 方法),传入 `STREAM_SOURCE_PORT_HTTP`(前面定义的流数据源端口号)和 `grunt` 对象作为参数来启动流数据源服务,
|
|
|
|
|
// 使得后续的任务(比如测试任务等)可以基于这个流数据源进行相应的操作,比如获取测试数据等。
|
|
|
|
|
streamSource = require('./test/streamsource.js');
|
|
|
|
|
streamSource.start(STREAM_SOURCE_PORT_HTTP, grunt);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 注册一个名为 `jasmine_node_oboe` 的 Grunt 任务,任务描述为 `Runs jasmine-node.`,用于运行 `jasmine-node` 相关的测试操作,
|
|
|
|
|
// 在任务函数内部通过调用 `runNpmScript` 函数(前面有定义,用于运行 `npm` 脚本命令)来执行 `test-node` 这个 `npm` 脚本,并传入 `this.async()`,
|
|
|
|
|
// `this.async()` 是 Grunt 任务中用于支持异步操作的方法,它返回一个回调函数,用于告知 Grunt 任务何时完成,确保任务的异步执行逻辑能正确被 Grunt 框架识别和管理。
|
|
|
|
|
grunt.registerTask('jasmine_node_oboe', 'Runs jasmine-node.', function () {
|
|
|
|
|
runNpmScript('test-node', this.async())
|
|
|
|
|
})
|
|
|
|
|
runNpmScript('test-node', this.async());
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// change the auto-starting browsers so that future tests will use
|
|
|
|
|
// phantomjs instead of actual browsers. Can do:
|
|
|
|
|
// grunt headless-mode default
|
|
|
|
|
// to run without any actual browsers
|
|
|
|
|
// 注册一个名为 `headless-mode` 的 Grunt 任务,这个任务的作用是改变自动启动浏览器的配置,将原本默认自动启动的浏览器列表(`autoStartBrowsers`)清空,
|
|
|
|
|
// 然后添加 `PhantomJS` 作为唯一的自动启动浏览器,这样后续执行相关测试任务时(比如某些默认使用自动启动浏览器的 `Karma` 测试任务)就会使用 `PhantomJS` 浏览器进行测试,
|
|
|
|
|
// 实现了切换到无界面(headless)模式进行测试的功能,方便在不需要实际浏览器界面展示的情况下运行测试,例如在持续集成环境中或者只关注测试结果不关心界面展示的场景下使用。
|
|
|
|
|
// 通过执行 `grunt headless-mode default` 命令就可以在不使用实际浏览器的情况下运行测试任务(这里 `default` 可能是后续其他默认配置相关的操作,具体要看整体使用场景)。
|
|
|
|
|
grunt.registerTask('headless-mode', function () {
|
|
|
|
|
autoStartBrowsers.length = 0
|
|
|
|
|
autoStartBrowsers.push('PhantomJS')
|
|
|
|
|
})
|
|
|
|
|
autoStartBrowsers.length = 0;
|
|
|
|
|
autoStartBrowsers.push('PhantomJS');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 注册一个名为 `test-start-server` 的 Grunt 任务,该任务只包含一个子任务 `karma:persist`,
|
|
|
|
|
// 其目的是启动一个持久化的 `Karma` 服务器,方便后续可以多次向这个服务器提交测试任务去运行,而不需要每次都重新启动服务器,常用于开发过程中持续进行测试的场景。
|
|
|
|
|
grunt.registerTask('test-start-server', [
|
|
|
|
|
'karma:persist'
|
|
|
|
|
])
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
// 注册一个名为 `test-run` 的 Grunt 任务,该任务包含 `karma:persist:run` 子任务,用于在已经启动的持久化 `Karma` 服务器(通过 `test-start-server` 任务启动)上运行测试任务,
|
|
|
|
|
// 实现了将服务器启动和运行测试分离的操作方式,使得可以灵活控制服务器的启动时机以及测试的执行时间,提高测试执行的灵活性和效率。
|
|
|
|
|
grunt.registerTask('test-run', [
|
|
|
|
|
'karma:persist:run'
|
|
|
|
|
])
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
// 注册一个名为 `dist-sizes` 的 Grunt 任务,该任务包含 `exec:reportMinifiedAndGzippedSize` 子任务,
|
|
|
|
|
// 其作用是执行获取压缩并经过 `gzip` 处理后的文件大小的相关命令(前面 `exec` 任务配置中有具体定义),用于查看构建生成的文件在经过相关处理后的大小情况,
|
|
|
|
|
// 方便开发人员监控文件大小是否符合预期,比如是否超出了某个限制等,对于优化项目构建输出有一定的帮助。
|
|
|
|
|
grunt.registerTask('dist-sizes', [
|
|
|
|
|
'exec:reportMinifiedAndGzippedSize'
|
|
|
|
|
])
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
// 注册一个名为 `node-build` 的 Grunt 任务,该任务包含 `exec:createGitVersionJs` 和 `exec:webpackNode` 两个子任务,
|
|
|
|
|
// 主要用于执行与 Node.js 相关的构建操作,先是通过 `exec:createGitVersionJs` 创建包含 Git 版本描述信息的文件(可能用于版本管理或者在构建输出中体现版本信息等),
|
|
|
|
|
// 然后通过 `exec:webpackNode` 启动 Webpack 针对 Node.js 相关代码的构建任务(使用特定的 Node.js 相关的 Webpack 配置文件),完成 Node.js 代码的打包、编译等构建流程。
|
|
|
|
|
grunt.registerTask('node-build', [
|
|
|
|
|
'exec:createGitVersionJs',
|
|
|
|
|
'exec:webpackNode'
|
|
|
|
|
])
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
// 注册一个名为 `node-build-test` 的 Grunt 任务,该任务包含 `node-build` 和 `jasmine_node_oboe` 两个子任务,
|
|
|
|
|
// 先是执行 `node-build` 任务完成 Node.js 相关代码的构建操作,然后执行 `jasmine_node_oboe` 任务运行 `jasmine-node` 相关的测试,实现了构建后立即进行测试的流程,
|
|
|
|
|
// 便于及时发现 Node.js 代码在构建后是否存在问题,保证代码质量,常用于开发过程中的持续集成和代码验证环节。
|
|
|
|
|
grunt.registerTask('node-build-test', [
|
|
|
|
|
'node-build',
|
|
|
|
|
'jasmine_node_oboe'
|
|
|
|
|
])
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
// 注册一个名为 `node` 的 Grunt 任务,该任务包含 `start-stream-source` 和 `node-build-test` 两个子任务,
|
|
|
|
|
// 先启动流数据源服务(通过 `start-stream-source` 任务),为后续测试等操作提供数据支持等,然后执行 `node-build-test` 任务完成 Node.js 相关代码的构建与测试流程,
|
|
|
|
|
// 整合了相关前置准备和主要的构建测试操作,在整个项目构建和测试体系中作为针对 Node.js 部分的一个完整流程任务存在。
|
|
|
|
|
grunt.registerTask('node', [
|
|
|
|
|
'start-stream-source',
|
|
|
|
|
'node-build-test'
|
|
|
|
|
])
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
// 注册一个名为 `browser-build` 的 Grunt 任务,该任务包含 `exec:createGitVersionJs` 和 `exec:webpackBrowser` 两个子任务,
|
|
|
|
|
// 主要用于执行与浏览器相关代码的构建操作,先是通过 `exec:createGitVersionJs` 创建包含 Git 版本描述信息的文件(同样可能用于版本管理等目的),
|
|
|
|
|
// 然后通过 `exec:webpackBrowser` 启动 Webpack 针对浏览器相关代码的构建任务(使用默认的浏览器相关的 Webpack 配置),完成浏览器端代码的打包、编译等构建流程,
|
|
|
|
|
// 以生成适合在浏览器中运行的代码文件,是浏览器端代码构建环节的重要任务配置。
|
|
|
|
|
grunt.registerTask('browser-build', [
|
|
|
|
|
'exec:createGitVersionJs',
|
|
|
|
|
'exec:webpackBrowser'
|
|
|
|
|
])
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
// 注册一个名为 `browser-build-test` 的 Grunt 任务,该任务包含多个子任务,按照顺序依次执行 `karma:single-dev`(在默认自动启动的浏览器中运行开发相关的测试)、
|
|
|
|
|
// `karma:single-browser-http`(在默认自动启动的浏览器中运行基于 HTTP 相关配置的测试)、`browser-build`(执行浏览器相关代码的构建操作)、
|
|
|
|
|
// `karma:single-concat`(在默认自动启动的浏览器中运行与文件合并相关的测试)、`karma:single-minified`(在默认自动启动的浏览器中运行针对压缩后代码的测试)、
|
|
|
|
|
// `karma:single-amd`(在默认自动启动的浏览器中运行针对遵循 AMD 规范的代码的测试)等任务,实现了浏览器端代码构建、多种不同类型测试的完整流程,
|
|
|
|
|
// 可以全面地对浏览器端代码进行验证,确保代码在不同场景和配置下都能正常运行并符合预期,是浏览器端代码质量保障的重要任务组合。
|
|
|
|
|
grunt.registerTask('browser-build-test', [
|
|
|
|
|
'karma:single-dev',
|
|
|
|
|
'karma:single-browser-http',
|
|
|
|
|
@ -250,44 +363,50 @@ module.exports = function (grunt) {
|
|
|
|
|
'karma:single-concat',
|
|
|
|
|
'karma:single-minified',
|
|
|
|
|
'karma:single-amd'
|
|
|
|
|
])
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
// 注册一个名为 `build` 的 Grunt 任务,该任务只包含 `exec:webpackBrowser` 子任务,主要就是启动 Webpack 针对浏览器相关代码的构建任务,
|
|
|
|
|
// 侧重于单纯的浏览器端代码构建操作,相对比较简洁直接,适用于只需要进行基本的浏览器代码打包、编译等场景,而不需要像 `browser-build-test` 那样执行一系列测试任务的情况。
|
|
|
|
|
grunt.registerTask('build', [
|
|
|
|
|
'exec:webpackBrowser'
|
|
|
|
|
])
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
// build and run just the integration tests.
|
|
|
|
|
// 注册一个名为 `build-integration-test` 的 Grunt 任务,该任务包含多个子任务,先是执行 `build` 任务完成浏览器相关代码的构建,然后启动流数据源服务(通过 `start-stream-source` 任务),
|
|
|
|
|
// 接着在默认自动启动的浏览器中运行与文件合并相关的测试(`karma:single-concat`),再运行 `jasmine-node` 相关的测试(`jasmine_node_oboe`),最后查看构建生成文件的大小情况(`dist-sizes`),
|
|
|
|
|
// 实现了构建、数据源准备、多种测试以及文件大小监控的完整流程,用于对整个项目进行集成测试,确保不同部分协同工作正常,代码在集成环境下的整体功能和性能符合预期。
|
|
|
|
|
grunt.registerTask('build-integration-test', [
|
|
|
|
|
'build',
|
|
|
|
|
'start-stream-source',
|
|
|
|
|
'karma:single-concat',
|
|
|
|
|
'jasmine_node_oboe',
|
|
|
|
|
'dist-sizes'
|
|
|
|
|
])
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
// 注册一个名为 `default` 的 Grunt 任务,这个任务通常是在没有指定具体执行哪个任务时默认执行的任务组合,包含多个子任务,
|
|
|
|
|
// 先是执行 `clear`(这里不确定 `clear` 具体定义,如果存在可能是用于清理某些通用的内容,比如临时文件等,不过代码中前面未明确看到其配置,可能是遗漏或者在其他地方定义)和 `clean`(用于清理指定的文件,前面 `clean` 任务配置中有定义)任务清理相关文件和环境,
|
|
|
|
|
// 然后启动流数据源服务(`start-stream-source`),接着执行 `browser-build-test`(完成浏览器端代码构建与多种测试)、`node-build-test`(完成 Node.js 相关代码构建与测试),最后查看构建生成文件的大小情况(`dist-sizes`),
|
|
|
|
|
// 整合了项目中主要的清理、构建、测试以及文件大小监控等操作,作为一个默认的完整项目构建和验证流程存在,方便在日常开发或者简单部署场景下直接使用。
|
|
|
|
|
grunt.registerTask('default', [
|
|
|
|
|
|
|
|
|
|
'clear',
|
|
|
|
|
'clean',
|
|
|
|
|
'start-stream-source',
|
|
|
|
|
|
|
|
|
|
'browser-build-test',
|
|
|
|
|
|
|
|
|
|
'node-build-test',
|
|
|
|
|
|
|
|
|
|
'dist-sizes'
|
|
|
|
|
])
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
// browser-test-auto-run or node-test-auto-run
|
|
|
|
|
//
|
|
|
|
|
// The most useful for developing. Start this task, capture some browsers
|
|
|
|
|
// (unless node) then edit the code. Tests will be run as the code is
|
|
|
|
|
// saved.
|
|
|
|
|
// 注册一个名为 `browser-test-auto-run` 的 Grunt 任务,该任务包含 `start-stream-source`、`karma:persist` 和 `concurrent:watchDev` 三个子任务,
|
|
|
|
|
// 先启动流数据源服务,接着启动一个持久化的 `Karma` 服务器,然后同时运行 `watchDev` 相关的多个 `watch` 任务(前面 `concurrent` 配置中有定义,用于监听文件变化并执行相应测试等任务),
|
|
|
|
|
// 实现了在开发过程中自动监听文件变化并自动运行浏览器相关测试的功能,开发人员只需要启动这个任务,然后捕获好相关浏览器(可能是手动启动一些浏览器并让 `Karma` 能连接到它们等操作),
|
|
|
|
|
// 之后在编辑代码保存时,就能自动触发测试任务运行,极大地提高了开发效率,方便及时发现代码修改对浏览器端代码功能的影响。
|
|
|
|
|
grunt.registerTask('browser-test-auto-run', [
|
|
|
|
|
'start-stream-source',
|
|
|
|
|
'karma:persist',
|
|
|
|
|
'concurrent:watchDev'
|
|
|
|
|
])
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
// 注册一个名为 `node-test-auto-run` 的 Grunt 任务,该任务包含 `start-stream-source` 和 `watch:testNode` 两个子任务,
|
|
|
|
|
// 先启动流数据源服务,然后启动监听 Node.js 相关代码文件变化的 `watch` 任务(前面 `watch` 任务配置中有定义),当 Node.js 相关代码文件发生变化时,
|
|
|
|
|
grunt.registerTask('node-test-auto-run', [
|
|
|
|
|
'start-stream-source',
|
|
|
|
|
'watch:testNode'
|
|
|
|
|
|