2013-09-18 4 views
1

У меня проблема, которую я не могу решить. Я пробовал пару разных способов, но пока ничего не работает.Как получить доступ к обратному вызову при задании grunt, установленном в initConfig

Я использую grunt-messageformat, чтобы создать локализованную копию i18n. У меня есть 2 папки с языками в них, и я хотел бы, чтобы grunt автоматически генерировал правильный вывод для каждой папки (языка).

Задача, которая заставила меня ближе всего это:

grunt.registerTask("ReadFolders", "Read the language folders in app/data/i18n/", function() { 
    // Returns an array of the paths to the language folders. 
    // ['app/data/i18n/en', 'app/data/i18n/key', ...] 
    var languageFolders = grunt.file.expand("app/data/i18n/*"); 
    var path; 
    var languageName; 
    var i; 

    for (i = 0; i < languageFolders.length; i++) { 
    path = languageFolders[i]; 
    languageName = path.substring(path.lastIndexOf("/") + 1, path.length); 

    grunt.config.set("mFormat.locale", languageName); 
    grunt.config.set("mFormat.inputdir", "app/data/i18n/" + languageName); 
    grunt.config.set("mFormat.output", "app-dist/test/js/locales/" + languageName + "/i18n.js"); 

    grunt.task.run("messageformat:all"); 
    } 
}); 

Это также использует следующий код для моей MessageFormat задачи, которая устанавливается в initConfig:

messageformat: { 
    all: { 
    locale: "<%= mFormat.locale %>", 
    inputdir: "<%= mFormat.inputdir%>", 
    output: "<%= mFormat.output%>" 
    } 
} 

Проблема в том, что мой цикл в 'readFolders' пробегает два раза до запуска задачи messageFormat, что означает, что задача выполняется дважды, но оба раза она использует последние значения для переменных mFormat.

Я не вижу примеров того, как обращаться к обратному вызову задачи, настроенной с помощью initConfig.

Любые мысли? Или другие идеи?

Благодаря

+0

Другой вариант, который я рассматривал, передавал в 3 переменные задачи, но я не был уверен, как это сделать ... Что-то вроде grunt.task.run ("messageformat: all", {locale: " что-то ", inputdir:" somethingElse ", output:" anotherThing "}); – ThePuzzleMaster

ответ

1

Ну я не нашел способ сделать то, что я изначально просил ... Но я нашел хорошее решение, которое удовлетворяет мои потребности. Вместо запуска задачи для каждой папки я вместо этого динамически переписываю конфигурацию messageformat для каждого языка.

grunt.registerTask("ReadFolders", "Read the language folders in app/data/i18n/", function() { 
    // Returns an array of the paths to the language folders. 
    // ['app/data/i18n/en', 'app/data/i18n/key', ...] 
    var languageFolders = grunt.file.expand("app/data/i18n/*"); 
    var path; 
    var languageName; 
    var locale; 
    var messageFormat = {}; 
    var i = 0; 

    for (i = 0; i < languageFolders.length; i++) { 
    path = languageFolders[i]; 
    languageName = path.substring(path.lastIndexOf("/") + 1, path.length); 

    locale = languageName; 
    if (languageName === "key") {locale = "en"; } 

    messageFormat[languageName] = { 
     locale: locale, 
     inputdir: "app/data/i18n/" + languageName, 
     output: "app-dist/test/js/locales/" + languageName + "/i18n.js" 
    }; 

    } 

    grunt.config.set("messageformat", messageFormat); 

    grunt.task.run("messageformat"); 
}); 

После довольно исчерпывающего поиска, я считаю, что это единственно возможный (и, откровенно говоря, в моем случае, тем лучше) решение.

По-прежнему рады услышать о любых других идеях, если у кого-то есть.

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