【问题标题】:Gulp hook before 'cordova build xxx''cordova build xxx' 之前的 Gulp 钩子
【发布时间】:2015-02-03 20:43:24
【问题描述】:

我的gulpfile.js 有一些任务,我想在执行cordova build 时执行一项任务

我在hooks 文件夹内创建了一个before_build 文件夹,并在一个js 文件中使用了一个简单的console.log("a")

但是当我运行例如cordova build android 它说'console' is undefined 时,我必须做其他事情来运行Javascript?我找不到更多信息。

谢谢!

编辑:

我在我的 .js 文件顶部添加了 #!/usr/bin/env node 并且 console.log 有效,但现在我想做 gulp myTask 并扔给我 gulp is not defined

【问题讨论】:

    标签: cordova gulp cordova-cli


    【解决方案1】:

    您可以在不离开 Node 的情况下运行它,只需将此代码粘贴到文件 before_build/010_compile_css.js

    #!/usr/bin/env node
    
    var gulp = require('gulp');
    var path  = require('path');
    
    var rootdir = process.argv[2];
    var gulpfile = path.join(rootdir, 'gulpfile.js');
    
    process.stdout.write('Compiling SCSS');
    
    require(gulpfile);
    
    //interaction
    gulp.start('scss');
    

    【讨论】:

    • gulp.start() 会按照 Cordova 钩子的要求同步完成吗?
    • 我发现 gulp.start() 已被弃用并计划被删除:github.com/gulpjs/gulp/issues/505 .. 虽然那是一年前的事了!
    • 最新的 Cordova 不再推荐使用 hooks 文件夹,它很快就会被弃用。请按照@David Douglas的建议使用JS方法
    【解决方案2】:

    我发现我必须使用 __dirname 来获取“gulpfile.js”文件。

    #!/usr/bin/env node
    
    module.exports = function(context) {
      var Q = context.requireCordovaModule('q');
      var deferral = new Q.defer();
    
      var path = require('path'),
          gulp = require('gulp'),
          gulpfile = path.join(__dirname, 'gulpfile');
      require(gulpfile);
    
      gulp.start('myTask').once('task_stop', function(){
          console.log('myTask done');
          deferral.resolve();
      });
    
      return deferral.promise;
    }
    

    注意:“gulpfile.js”和“hook.js”在同一目录中。您可以在 Cordova 的 config.xml 文件中设置自定义路径来挂钩 js 文件:

    <hook type="before_build" src="app/hook.js" />
    

    【讨论】:

    • 还要注意 Cordova 钩子脚本从根项目目录执行,因此如果您的 gulpfile.js 从子目录中运行,您可能会遇到文件路径问题。
    【解决方案3】:

    终于可以运行命令了,这是我在hooks/before_build中的.js文件

    #!/usr/bin/env node
    var sys = require('sys')
    var exec = require('child_process').exec;
    function puts(error, stdout, stderr) { sys.puts(stdout) }
    exec("gulp", puts);
    

    【讨论】:

    • 不是最佳解决方案,因为您正在从节点创建一个新进程来运行另一个节点脚本 (gulp)。
    • @AlexStack 那么,您认为这是一个更好的解决方案吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多