nodejs - 运行 g运行t 任务以编程方式
nodejs - run grunt task programmatically
我正在使用 g运行t 任务来 watch 和 concatenate 一些 js 文件。
我的第一个配置运行良好:
grunt.initConfig({
watch: {
js: {
files: ['web/**/*.js'],
tasks: ['concat:JS']
}
},
concat: {
JS: {
files: {
"index.js": [
"test-1.js",
"test-2.js",
],
"about_us.js": [
"test-3.js",
"test-4.js",
],
"store.js": [
"test-5.js",
"test-6.js",
]
}
}
}
});
我的问题是,使用此配置,每当我更改文件时,它都会连接所有内容。
我将能够仅连接特定文件(基于更改的文件)。
例如如果我更改 test-1.js
我只想连接 index.js
文件(..所以 运行 的任务应该是 'concat:JS:index.js'
)
所以我尝试添加一个观看事件
grunt.event.on('watch', function(action, filepath, target) {
var taskName = "concat:JS"; //here i calculate dinamically the specific task name to be run
grunt.task.run(taskName);
});
但什么也没发生..有什么想法吗?谢谢
新答案post编辑问题
使用 grunt.event.on('watch', ...)
侦听器是不适合此类需求的工具。相反,您应该为 watch
和 concat
任务使用多个 Targets,如下面的 Gruntfile.js
摘录所示。
Gruntfile.js
grunt.initConfig({
watch: {
'JS-index': {
files: ['web/js/test-1.js', 'web/js/test-2.js'],
tasks: ['concat:JS-index']
},
'JS-about-us': {
files: ['web/js/test-3.js', 'web/js/test-4.js'],
tasks: ['concat:JS-about-us']
},
'JS-store': {
files: ['web/js/test-5.js', 'web/js/test-6.js'],
tasks: ['concat:JS-store']
}
},
concat: {
'JS-index': {
files: {
'dist/js/index.js': [
"web/js/test-1.js",
"web/js/test-2.js",
]
}
},
'JS-about-us': {
files: {
"dist/js/about_us.js": [
"web/js/test-3.js",
"web/js/test-4.js",
]
}
},
'JS-store': {
files: {
'dist/js/store.js': [
"web/js/test-5.js",
"web/js/test-6.js",
]
}
}
}
});
备注
鉴于上面显示的配置,在 运行ning grunt watch
之后将通过您的 CLI 发生以下情况:
更改 test-1.js
或 test-2.js
会将两个文件合并为 dist/js/index.js
.
更改 test-3.js
或 test-4.js
会将两个文件合并为 dist/js/about_us.js
.
更改 test-5.js
或 test-6.js
会将两个文件合并为 dist/js/store.js
.
您的路径需要根据需要进行配置
编辑问题前的原始答案
how do i execute a task with grunt?
使用 grunt.task.run
是编程 运行 任务的正确方法。
但是,请参阅 grunt-contrib-watch
github 存储库中的 comment。摘录如下:
"Don't use grunt.event.on('watch')
to run your tasks."
和...
"The watch event is not intended for running tasks."
以下解决方案假定您的要求是连接一些 .js
个文件,其中一个文件是 changed/edited。在这种情况下,您需要利用 watch
任务的 tasks
属性 来定义要 运行 的任务(即 'concat:JS'
)
G运行t文件
module.exports = function(grunt) {
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.initConfig({
watch: {
js: {
files: ['path/to/js/**/*.js'], // <-- 1. Glob pattern to .js files
tasks: ['concat:JS'] // <-- 2. Task to run when .js file changes.
}
},
concat: { // <-- 3. Configure your `concat` task as necessary.
JS: {
src: [
'path/to/js/foo.js',
'path/to/js/bar.js',
'path/to/js/quux.js'
],
dest: 'path/to/output/combined.js'
}
}
});
grunt.registerTask('default', ['watch']);
grunt.event.on('watch', function(action, filepath, target) {
console.log("yep, this code is being executed");
// 4. <-- Do not run task from 'on' listener event.
});
}
备注
- 在您的
watch
任务中定义源 .js
文件的 glob 模式以观察变化。
- 指定
.js
文件更改时 运行 的任务; IE。 'concat:JS'
- 根据需要配置您的
concat
任务。
- 从
grunt.event.on('watch', ...)
侦听器中删除 grunt.task.run('concat:JS');
。
- 使用上面的要点和 运行ning
grunt
当对存储在 path/to/js/
目录。 (您需要根据您的要求配置路径)
- 虽然
grunt.event.on('watch', ...)
侦听器不应该用于 运行 任务,但它可以用于配置其他任务。
我正在使用 g运行t 任务来 watch 和 concatenate 一些 js 文件。
我的第一个配置运行良好:
grunt.initConfig({
watch: {
js: {
files: ['web/**/*.js'],
tasks: ['concat:JS']
}
},
concat: {
JS: {
files: {
"index.js": [
"test-1.js",
"test-2.js",
],
"about_us.js": [
"test-3.js",
"test-4.js",
],
"store.js": [
"test-5.js",
"test-6.js",
]
}
}
}
});
我的问题是,使用此配置,每当我更改文件时,它都会连接所有内容。
我将能够仅连接特定文件(基于更改的文件)。
例如如果我更改 test-1.js
我只想连接 index.js
文件(..所以 运行 的任务应该是 'concat:JS:index.js'
)
所以我尝试添加一个观看事件
grunt.event.on('watch', function(action, filepath, target) {
var taskName = "concat:JS"; //here i calculate dinamically the specific task name to be run
grunt.task.run(taskName);
});
但什么也没发生..有什么想法吗?谢谢
新答案post编辑问题
使用 grunt.event.on('watch', ...)
侦听器是不适合此类需求的工具。相反,您应该为 watch
和 concat
任务使用多个 Targets,如下面的 Gruntfile.js
摘录所示。
Gruntfile.js
grunt.initConfig({
watch: {
'JS-index': {
files: ['web/js/test-1.js', 'web/js/test-2.js'],
tasks: ['concat:JS-index']
},
'JS-about-us': {
files: ['web/js/test-3.js', 'web/js/test-4.js'],
tasks: ['concat:JS-about-us']
},
'JS-store': {
files: ['web/js/test-5.js', 'web/js/test-6.js'],
tasks: ['concat:JS-store']
}
},
concat: {
'JS-index': {
files: {
'dist/js/index.js': [
"web/js/test-1.js",
"web/js/test-2.js",
]
}
},
'JS-about-us': {
files: {
"dist/js/about_us.js": [
"web/js/test-3.js",
"web/js/test-4.js",
]
}
},
'JS-store': {
files: {
'dist/js/store.js': [
"web/js/test-5.js",
"web/js/test-6.js",
]
}
}
}
});
备注
鉴于上面显示的配置,在 运行ning grunt watch
之后将通过您的 CLI 发生以下情况:
更改
test-1.js
或test-2.js
会将两个文件合并为dist/js/index.js
.更改
test-3.js
或test-4.js
会将两个文件合并为dist/js/about_us.js
.更改
test-5.js
或test-6.js
会将两个文件合并为dist/js/store.js
.
您的路径需要根据需要进行配置
编辑问题前的原始答案
how do i execute a task with grunt?
使用 grunt.task.run
是编程 运行 任务的正确方法。
但是,请参阅 grunt-contrib-watch
github 存储库中的 comment。摘录如下:
"Don't use
grunt.event.on('watch')
to run your tasks."
和...
"The watch event is not intended for running tasks."
以下解决方案假定您的要求是连接一些 .js
个文件,其中一个文件是 changed/edited。在这种情况下,您需要利用 watch
任务的 tasks
属性 来定义要 运行 的任务(即 'concat:JS'
)
G运行t文件
module.exports = function(grunt) {
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.initConfig({
watch: {
js: {
files: ['path/to/js/**/*.js'], // <-- 1. Glob pattern to .js files
tasks: ['concat:JS'] // <-- 2. Task to run when .js file changes.
}
},
concat: { // <-- 3. Configure your `concat` task as necessary.
JS: {
src: [
'path/to/js/foo.js',
'path/to/js/bar.js',
'path/to/js/quux.js'
],
dest: 'path/to/output/combined.js'
}
}
});
grunt.registerTask('default', ['watch']);
grunt.event.on('watch', function(action, filepath, target) {
console.log("yep, this code is being executed");
// 4. <-- Do not run task from 'on' listener event.
});
}
备注
- 在您的
watch
任务中定义源.js
文件的 glob 模式以观察变化。 - 指定
.js
文件更改时 运行 的任务; IE。'concat:JS'
- 根据需要配置您的
concat
任务。 - 从
grunt.event.on('watch', ...)
侦听器中删除grunt.task.run('concat:JS');
。 - 使用上面的要点和 运行ning
grunt
当对存储在path/to/js/
目录。 (您需要根据您的要求配置路径) - 虽然
grunt.event.on('watch', ...)
侦听器不应该用于 运行 任务,但它可以用于配置其他任务。