将作为参数更改的监视文件的名称传递给shell命令

时间:2016-05-25 09:23:33

标签: gruntjs grunt-contrib-watch grunt-shell

我有一组.svg文件。 当我修改其中一个时,我希望grunt在每个被修改的svg文件上重新运行命令

inkscape --file=FILENAME.svg --export-pdf=FILENAME.pdf

到目前为止,我有这个笨拙的脚本

module.exports = function (grunt) {
'use strict';
grunt.initConfig({
  shell: {
    figures: {
      command: 'inkscape --file=FILENAME.svg --export-pdf=FILENAME.pdf'
    }
  },
  watch: {
    figs: {
      files: '**/*.svg',
      tasks: ['shell:figures']
    }
  }
});
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-shell');

grunt.registerTask('default', [watch']);
};

但我不知道如何配置grunt以便用被修改的每个文件的名称替换FILENAME

1 个答案:

答案 0 :(得分:1)

我使用在watch运行之前在shell:figs事件上修改的配置变量解决了该问题

module.exports = function (grunt) {
  'use strict';
  // Project configuration
  grunt.initConfig({
    shell: {
      figs: {
        command: function() {
          return 'inkscape --file="' + grunt.config('shell.figs.src') + '" --export-pdf="' + grunt.config('shell.figs.src').replace('.svg', '.pdf') + '"';
        },
        src: '**/*.svg'
      }
    },
    watch: {
      svgs: {
        files: '**/*.svg',
        tasks: ['shell:figs'],
        options: {
        spawn: false,
        }
      }
    }
  });

  grunt.event.on('watch', function(action, filepath) {
    grunt.config('shell.figs.src', filepath);
  });

  // These plugins provide necessary tasks
  grunt.loadNpmTasks('grunt-contrib-watch');
  grunt.loadNpmTasks('grunt-shell');

  // Default task
  grunt.registerTask('default', ['connect', 'watch']);
};

唯一的缺点是shell:figs无法手动调用,只有在运行watch任务时才有效,或者只是grunt