我正在构建一个应用程序,其中Grunt编译一个文件,作为下载返回给用户。
如果我已有静态文件,我可以这样做:
app.post('/', function(req, res){
var pkgFile = __dirname + '/myfile.js';
var filestream = fs.createReadStream(pkgFile);
filestream.pipe(res);
});
问题是如果文件是由Grunt编译的,从app.post()
内部调用,当Grunt任务完成时,它会退出我的快速服务器。我得到一个混乱"完成,没有错误"并且过程退出。
我正在使用Grunt.cli运行我的Grunt任务并将回调传递给我的打包程序,因为我的Grunt任务返回数据,没有写入文件。
grunt.cli({
gruntfile: __dirname + "/../gruntfile.js",
modules: modules,
strip: !compat,
releaseVersion: version,
project: project,
noCoreDependencies: !addCoreDependencies,
callback: stream
});
function stream (data) {
var filename = ['MooTools-', project, '-', version, (compat ? '-compat' : '') + (minified ? '-compressed' : ''), '.js'].join('');
if (minified) data = uglify(data);
res.setHeader('Content-Type', 'application/javascript');
res.setHeader('Content-disposition', 'attachment; filename=' + filename);
res.write(data, 'binary');
res.end();
}
这样一切都可以一次,然后我必须重新启动服务器......
有没有办法可以将Grunt.cli作为子进程运行,或者以不退出服务器的方式运行,和能够将该回调作为参数放入grunt选项?
或者有更好的方法来设计它吗?
我正在做的是将库中的不同文件编译成一个.js
文件> uglifying it>提供下载给用户。
"use strict";
module.exports = function(grunt) {
require('load-grunt-tasks')(grunt);
var cb = grunt.option('callback'),
strip = grunt.option('strip'),
version = grunt.option('releaseVersion'),
modules = grunt.option('modules'),
project = grunt.option('project'),
noCoreDependencies = grunt.option('noCoreDependencies');
function projectPath(project_, version_){
var versions = require('./package.json')._projects[project_].versions;
if (!~versions.indexOf(version_)) version_ = versions.filter(function(ver){
return ver.slice(0, -2) <= version_.slice(0, -2);
})[0];
return 'cache/' + project_.toLowerCase() + '/docs/' + project_.toLowerCase() + '-' + version + '/Source/';
}
var packagerOptions = {
options: {
name: {
Core: projectPath('core', version),
More: projectPath('more', version)
},
callback: cb,
noOutput: true,
ignoreYAMLheader: noCoreDependencies
},
customBuild: {
src: [projectPath('core', version) + '**/*.js', projectPath('more', version) + '**/*.js'],
dest: 'mootools-rocks!.js'
}
}
if (modules.length) packagerOptions.options.only = modules;
if (strip) packagerOptions.options.strip = ['.*compat'];
grunt.initConfig({
'packager': packagerOptions
});
grunt.registerTask('default', 'build file and don\'t exit', function(){
grunt.task.run(['packager:customBuild']);
// how to prevent process.exit() ?
});
};