调用一个在src属性中返回数组的函数

时间:2014-04-27 21:18:40

标签: gruntjs

我有一个Grunt任务,需要通过调用返回数组的函数来构建src属性。但是,当从数组返回多个项时,将忽略返回值。

我已将问题简化为最简单的形式。假设我有一个函数getItems,它只返回一个包含两个字符串的数组(项目中的文件)。

getItems: function() {
  return ['build/file1.js', 'build/file2.js'];
}

假设我们想在src任务的clean属性中调用此函数。

clean: {
  items: ['<%= getItems() %>', 'build/file3.js']
}

调用clean:items确实 从项目中移除build/file1.jsbuild/file2.js(但会删除build/file3.js)。为什么不呢?

值得注意的是,此行为存在于任何任务中,而不仅仅是clean。我只是将clean用于演示目的。

但是,如果我从getItems函数返回一个项,则clean任务会将其删除。

// the following removes build/file1.js and build/file3.js from the project

getItems: function() {
  return ['build/file1.js'];
}

clean: {
  items: ['<%= getItems() %>', 'build/file3.js']
}

还值得注意的是,仅使用 getItems函数在返回多个项目时无效。

// the following does not remove build/file1.js or build/file2.js

getItems: function() {
  return ['build/file1.js', 'build/file2.js'];
}

clean: {
  items: '<%= getItems() %>'
}

为什么我不能在任意任务的src属性中调用返回包含多个项的数组的函数?

2 个答案:

答案 0 :(得分:1)

grunt.initConfig中定义函数并且没有运气时,我尝试了一段时间才能使其工作。

有没有什么能阻止你在initConfig之前定义它?

你可以这样做:

module.exports = function(grunt) {

  // define the function outside of the config
  var getItems = function() {
    return ['build/file1.js', 'build/file2.js'];
  };

  grunt.initConfig({

    clean: {
      items: getItems()
    }

  });

  grunt.loadNpmTasks('grunt-contrib-clean');
};

然后,如果你想在那里使用file3.js,那就是concat:

clean: {
  items: getItems().concat(['build/file3.js'])
}

答案 1 :(得分:1)

jshanley的答案正是我建议你解决问题的方法。

getItems函数在数组中返回单个项时的原因是因为函数返回的内容以字符串形式返回,因为您通过模板字符串调用该函数。

要看到这一点,您可以尝试:

grunt.registerTask('debug', function () {
    console.log(grunt.template.process('<%= getItems() %>'));
});

当getItems函数返回数组中的一个项目时:

getItems: function () {
    return ['test3'];
}

运行grunt debug,返回

Running "debug" task
test3

Done, without errors.

当getItems函数返回数组中的多个项时:

getItems: function () {
    return ['test3', 'test4'];
}

运行grunt debug,返回

Running "debug" task
test3,test4

Done, without errors.

因此,当你的配置看起来像:

clean: {
    items: ['<%= getItems() %>', 'build/file3.js']
}

它被grunt-contrib-clean插件用作:

clean: {
    items: ['build/file1.js,build/file2.js', 'build/file3.js']
}

这不是理想的行为。