涉及n个子目录的Dynamic Grunt

时间:2014-01-27 14:42:09

标签: javascript git gruntjs

我有一个文件夹布局,以便:

/ 
-- css/
-- js/
-- apps/
-- -- myFirstApp/
-- -- mySecondApp/
-- -- ...

每个都是git子模块,并且有相应的Gruntfile,package.json等。我想要做的是相同的命令序列,但根据相应的package.json而不同。

我的命令列表如下:

npm install
grunt dist
copy app/css/[fileName].css (from package.json) to css/
copy app/js/[fileName].js to js/
copy app/js/[fileName].html to /

是否有插件或我忽略的东西,我可以用咕噜这样做?如果可能的话,我不想静态地执行它 - 我只想更新子模块列表以使其工作。

2 个答案:

答案 0 :(得分:0)

我不知道任何预先构建的Grunt任务会为你做这件事,但编写任务并不困难。您需要引入Node fs模块来处理文件系统,显然还有其他一些事情要做......这里有一些代码和TODO'的一般结构S:

var fs = require("fs"),
    path = require("path");

module.exports = function ( grunt ) {
  grunt.initConfig({

    ... // all of your other Grunt config

    // options for our new task
    copymodulefiles: {
      all: {
        rootDir: "apps/"
      }
    }

  });

  // Here's our custom task definition
  grunt.registerMultiTask("copymodulefiles", "Copies files from sub-projects", function() {
    var done = this.async(), // tell Grunt this is an async task
        root = grunt.config(this.name + "." + this.target + ".rootDir"),
        modules = fs.readdirSync(root);

    modules.forEach(function(dirName) {
      var pkg = fs.readFileSync(root + dirName + path.sep + "package.json", "utf8");
          pkgJson = JSON.parse(pkg);

      // TODO: find what you need in the pkgJson variable
      //       copy files from wherever to wherever

      // You can write a file like so:
      fs.writeFile(theFilenameToWrite, "Contents of the new file", function (err) {
        // (check for errors!)

        // log it?
        grunt.log.ok("file written!");
      });

    });

    // Determine when all are complete and call "done()" to tell Grunt everything's complete
    // call Grunt's "done" method to signal task completion
    done();

  });
};

答案 1 :(得分:0)

尝试grunt-shell我觉得它很完美,并且做了类似你正在尝试的任务。

查看我编写的用于运行shell命令的 Gruntfile.js 配置:

shell: {
        multiple: {
            command: ['bower install',
                      'mv bower_components/** public/',
                  'rm -rf bower_components'
                  ].join('&&')
        }
    }

所以我在这里运行 bower ,然后我将其组件复制到公共文件夹,之后我删除了bower_components文件夹。所以我想从这里开始你可以根据你的用途自定义这个脚本。