2015-02-12 5 views
1

Я пытаюсь понять, как я могу передать частичное имя файла из командной строки grunt, чтобы запустить задачу (из установленного модуля grunt) в конкретном файле.Grunt - передать имя файла из командной строки

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

Я пробовал переработать окончательный пример на этой странице http://chrisawren.com/posts/Advanced-Grunt-tooling, но я немного вздрагиваю в темноте. Думал, что у кого-то будет быстрый ответ.

Вот мой Gruntfile:

module.exports = function (grunt) { 
    grunt.initConfig({ 
     globalConfig: globalConfig, 

     uglify: { 
      js: { 
      options: { 
       mangle: true 
      }, 
      files: { 
       'js/<%= globalConfig.file %>.min.js': ['js/<%= globalConfig.file %>.js'] 
      } 
      } 
     }, 



    }); 

    // Load tasks so we can use them 



    grunt.loadNpmTasks('grunt-contrib-uglify'); 

    grunt.registerTask('go', 'Runs a task on a specified file', function (fileName){ 
     globalConfig.file = fileName; 
     grunt.task.run('uglify:js'); 
    }); 
}; 

Я пытаюсь запустить его из командной строки, как это:

grunt go:app 

предназначаться Js/app.js

я получаю эту ошибку :

Aborted due to warnings. 
roberts-mbp:150212 - Grunt Tasks robthwaites$ grunt go:app 
Loading "Gruntfile.js" tasks...ERROR 
>> ReferenceError: globalConfig is not defined 
Warning: Task "go:app" not found. Use --force to continue. 

Than ks

ответ

5

вы можете использовать grunt.option.

Ваша задача регистрации ворча будет выглядеть следующим образом.

> grunt.option('fileName'); grunt.registerTask('go', 'Runs a task on a 
> specified file', function(){  
>  grunt.task.run('uglify:js'); 
>  }); 

конфигурация хрюкать будет

module.exports = function (grunt) { 
var fileName=grunt.option('fileName'); 
    grunt.initConfig({ 
     uglify: { 
      js: { 
      options: { 
       mangle: true 
      }, 
      files: { 
       'js/fileName.min.js': ['js/fileName.js'] 
      } 
      } 
     }, 
    }); 

команда для запуска задачи из терминала:

$ grunt go --fileName='xyzfile'

+0

Привет, Я нашел решение со слегка упрощенным синтаксисом ниже, по крайней мере для запуска команд из терминала. Интересно, есть ли у вас какое-то мнение по этому поводу? Во всяком случае, это еще одно решение. – spacewindow

1

I конец я был в состоянии сделать то, что я хотел, как это, но не если это стандартный способ.

То, что мне не удалось сделать, это сначала объявить глобальную переменную globalConfig, чтобы я мог переопределить ее из терминала, когда я запустил задачу.

Вот пример. При работе с HTML-писем мне нужно:

  1. Процесс моих Sass файлов в CSS (пехотинец-вно-Sass)
  2. Запуск autoprefixer на результирующее CSS (пехотинец-autoprefixer)
  3. Минимизировать мой CSS и удалите комментарии CSS (grunt-contrib-cssmin)
  4. Включите мой полный CSS в тег моего html-файла (используя grunt-include-replace)
  5. Наконец, запустите предварительный файл в файле, чтобы встроить все стили (grunt- premailer)

Дело в том, что если я работаю над несколькими разными HTMl-письмами в одном проекте, мне нужно иметь возможность запускать все эти задачи в html-файлах один за другим, по мере необходимости. Ниже приведенный ниже Gruntfile позволяет мне это сделать.

Что это делает:

Если вы входите в терминал grunt Это будет просто запустить задачу Сасс, которая обрабатывает все файлы Sass - нет параметра файла нужно от терминала.

Однако, если я хочу запустить серию процессов в одном файле html, я ввожу grunt process:fileName с именем файла, являющимся именем html-файла без расширения .html.

Вы заметите, что единственными задачами, для которых требуется имя файла, являются, фактически, include-replace и premailer. Тем не менее, я все еще хочу запускать другие задачи очистки CSS до того, как вы нажмете мой выбранный файл.

Ключа:

  1. Объявление глобальной переменной
  2. загрузки переменных GlobalConfig в grunt.initConfig
  3. Используйте переменную декларации черновой, где это необходимо в ваших задачах
  4. зарегистрировать пользовательское задание , причем переменная fileName используется как параметр.

Надеюсь, что кто-то поможет.

module.exports = function (grunt) { 

    var globalConfig = { 
     file: 'index' // this is the default value, for a single project. 
    } 

    grunt.initConfig({ 

     pkg: grunt.file.readJSON('package.json'), 

     // load the globalConfig variables 

     globalConfig: globalConfig, 

    sass: { 
     dev: { 
      files: [{ 
       expand: true, 
       cwd: 'scss', 
       src: ['*.scss'], 
       dest: 'css', 
       ext: '.css' 
    }] 
     } 
    }, 

    cssmin: { 
     options: { 
      keepSpecialComments: 0, 
      keepBreaks: true, 
      advanced: false 
     }, 
     target: { 
      files: [{ 
       expand: true, 
       cwd: 'css', 
       src: '*.css', 
       dest: 'css', 
       ext: '.css' 
    }] 
     } 
    }, 

    autoprefixer: { 
     css: { 
      src: "css/*.css" 
     } 
    }, 

    includereplace: { 
     your_target: { 
      options: { 
       prefix: '\\/\\* ', 
       suffix: ' \\*\\/', 
      }, 
      files: { 
       'inline/<%= globalConfig.file %>-inline.html': ['<%= globalConfig.file %>.html'] 
      } 
     } 
    }, 

    premailer: { 
     main: { 
      options: { 
       verbose: true, 
       preserveStyles: true, 
      }, 
      src: 'inline/<%= globalConfig.file %>-inline.html', 
      dest: 'inline/<%= globalConfig.file %>-inline.html' 
     } 
    }, 


}); 


grunt.loadNpmTasks('grunt-contrib-sass'); 
grunt.loadNpmTasks('grunt-autoprefixer'); 
grunt.loadNpmTasks('grunt-include-replace'); 
grunt.loadNpmTasks('grunt-premailer'); 

grunt.registerTask('default', 'sass'); 

grunt.registerTask('process', 'Runs all processing tasks on a specific file to produce inlined file', function (fileName) { 
    globalConfig.file = fileName; 
    grunt.task.run('sass', 'autoprefixer', 'cssmin', 'includereplace', 'premailer'); 
}); 

}

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

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