1

В настоящее время я пытаюсь создать задачу в параметрах отправки grunt для запуска другой задачи несколько раз.Grunt for-loop on grunt.task.run с переменными

Вот моя уже функциональная Одинарна задача:

var country = grunt.option('country') || 'X0'; 
var product = grunt.option('product') || 'Y0'; 
var subdomain = grunt.option('subdomain') || 'Z0'; 

grunt.registerTask('build_home', [ 
    'sprite:publicProduct', 
    'sprite:home', 
    'uglify:home', 
    'sass:home', 
    'csscomb:home', 
    'cssmin:home' 
]); 

Таким образом, в мой день в день, я бы запустить команду:

grunt build_home --country=X0 --product=Y7 --subdomain=Z3 

То, что я хочу сейчас, это задача, которая будет выполнять все мои возможные предопределенные варианты:

grunt build_home_all 

было бы что-то вроде этого:

grunt.registerTask('build_home_all', function() { 

    var products = ['Y0','Y1','Y2','Y3','Y4','Y5','Y6','Y7','Y8','Y9']; 
    var subdomains = ['Z0','Z1','Z2']; 

    for (i = 0; i < products.length; i++) { 
     for (j = 0; j < subdomains.length; j++) { 
      grunt.task.run('build_home --product='+products[i]+' --subdomain='+subdomains[j]); 
     }; 
    }; 

    grunt.log.ok(['Finished.']); 

}); 

Я уже достиг этого с grunt.util.spawn, но это своего рода запущенной асинхронно и заставляла мой процессор со всеми видами задач, запущенных одновременно.

+0

Вместо запуска задач в цикле for, вы должны подталкивать задачи к массиву, который вы генерируете в цикле for, а затем запускаете этот массив. – theaccordance

+0

@ theaccordance Это на самом деле очень полезно и является частью решения, но я все еще не могу запустить что-то вроде 'grunt.task.run ('build_home --country = X0 --product = Y7 --subdomain = Z3')' поскольку он отображает 'Warning: Task 'build_home --country = X0 --product = Y7 --subdomain = Z3" ​​не найден. Использовать --force для продолжения. 'Он просто не определяет параметры. –

+0

Вы хотите посмотреть создание пользовательской задачи в качестве инициализатора для каждого процесса сборки и передачи параметров с помощью 'this.args'. Ваши поставленные задачи будут выглядеть как 'build_home: X0: Y7: Z3'. Ссылка: http://gruntjs.com/api/inside-tasks#this.args – theaccordance

ответ

0

При использовании grunt.task.run метода вызова задачи, вы не сможете передать аргументы, как вы обычно с помощью интерфейса командной строки, но вы можете передать аргументы с помощью разделенных двоеточиями обозначения:
build_home --country=X0 --product=Y7 --subdomain=Z3 =>build_home:X0:Y7:Z3

Обновите свою build_home_all задачу следующим образом:

function buildHomeAll() = { 
    var products = ['Y0','Y1','Y2','Y3','Y4','Y5','Y6','Y7','Y8','Y9'], 
     subdomains = ['Z0','Z1','Z2'], 
     tasks = [], 
     country = grunt.option('country') || 'X0'; 


    for (i = 0; i < products.length; i++) { 
     for (j = 0; j < subdomains.length; j++) { 
      tasks.push(['build_home',country, products[i],'subdomains[j]'].join(':')); 
     }; 
    }; 
    grunt.task.run(tasks); 

    grunt.log.ok(['Finished.']); 
} 

Вы вызвать эту функцию с помощью grunt build_home_all --country=X0

Далее, вам необходимо изменить свой build_home задачу для учета новых аргументов образом могут быть переданы в:

function buildHome() = { 
    if (!grunt.option('country') { 
     grunt.option('country', this.args[0] || 'X0'); 
    }) 
    if (!grunt.option('product') { 
     grunt.option('product', this.args[1] || 'Y0'); 
    }) 
    if (!grunt.option('subdomain') { 
     grunt.option('subdomain', this.args[2] || 'Z0'); 
    }) 

    grunt.task.run([ 
     'sprite:publicProduct', 
     'sprite:home', 
     'uglify:home', 
     'sass:home', 
     'csscomb:home', 
     'cssmin:home' 
    ]); 

Наконец, разоблачить функций в gruntfile.js:

grunt.registerTask('build_home', buildHome); 
grunt.registerTask('build_home_all', buildHomeAll); 
+0

Мне удалось создать задачу и почти так же, как и вы. Разница в том, что я установил параметр на grunt.initConfig и изменил его с помощью grunt.config.set. Будет ли заметная разница в производительности? Большое спасибо. –

Смежные вопросы