2015-06-12 3 views
1

Я пытаюсь настроить мой JS сборки делать дальше:Изменение переменной JS с Grunt для различных сред

Я использую переменную JS, чтобы определить корень приложения:

globals.js

define(function (require) { 
    "use strict"; 
    return { 
     mainRoot: "http://myapp.com" 
     //mainRoot: "http://localhost:3000" - local run 
     //mainRoot: "http://myapp-test.com" - test server 
    }; 
}); 

в ходе развития на местном уровне, я использую код без Grunt сборки и запуска Grunt только для испытания & производство строит.

Grunt запускается из плагина Maven с использованием конфигурации командной строки. Таким образом, это единственный способ передать переменную окружения.

pom.xml

<plugin> 
    <groupId>pl.allegro</groupId> 
    <artifactId>grunt-maven-plugin</artifactId> 
    <configuration> 
     <gruntOptions> 
      <gruntOption>--verbose</gruntOption> 
     </gruntOptions> 
     <target>build</target> 
    </configuration> 
</plugin> 

конфигурация Grunt довольно проста и выглядит следующим образом:

Gruntfile.js

grunt.registerTask('build', [ 
    'karma', 
    'requirejs', 
    'concat', 
    'csso', 
    'copy', 
    'processhtml' 
]); 

Вопрос:

Как настроить Grunt для изменения моей переменной следующим образом?

  1. По умолчанию значение mainRoot должно быть http://localhost:3000
  2. переменная окружающей среды должна быть установлена ​​с помощью командной строки из плагина Maven
  3. При запуске Grunt с PROD среды - mainRoot должен быть изменен на http://myapp.com
  4. При запуске Грунт с окружающей средой TEST - mainRoot следует заменить на http://myapp-test.com

Спасибо!

+0

Вы пробовали использовать плагин, как [хрюкать замены] (https://github.com/outaTiME/grunt-replace)? – doldt

+0

Да, но мне непонятно, как настроить его с помощью плагинов 'grunt-env' или подобных окружений. –

+0

Честно говоря, существует множество способов сделать это - покажите нам, что вы пробовали с хрюканьем? – doldt

ответ

9

Я нахожу сочетание grunt-replace и grunt-config хорошо работает.

В вашем Gruntfile.js, настроить grunt-config как это (см README):

config: { 
    local: { 
     options: { 
      variables: { 
       mainroot: 'http://localhost:3000' 
      } 
     } 
    }, 
    test: { 
     options: { 
      variables: { 
       mainroot: 'http://myapp-test.com' 
      } 
     } 
    }, 
    prod: { 
     options: { 
      variables: { 
       mainroot: 'http://myapp.com' 
      } 
     } 
    } 
} 

В вашем globals.js создайте an @@ placeholder для grunt-replace, чтобы найти и заменить:

define(function (require) { 
    "use strict"; 
    return { 
     mainRoot: "@@MAINROOT" 
    }; 
}); 

В вашем Gruntfile.js, настроить grunt-replace:

replace: { 
    my_target: { 
     options: { 
      patterns: [ 
       { 
        match: 'MAINROOT', 
        replacement: '<%= grunt.config.get("mainroot") %>' 
       } 
      ] 
     }, 
     src: ... , 
     dest: ... 
    } 
} 

Затем создайте command-line option, такие как --env, который будет принимать local или test или prod, и по умолчанию будет local если опущено:

var envTarget = grunt.option('env') || 'local'; 

и обновить build задачу использовать config и replace:

grunt.registerTask('build', [ 
    'config:' + envTarget, 
    'replace', 
    'karma', 
    'requirejs', 
    'concat', 
    'csso', 
    'copy', 
    'processhtml' 
]); 

Теперь вы можете запустить Grunt из командной строки с новым --env вариант:

grunt build --env=local 
grunt build --env=test 
grunt build --env=prod 
Смежные вопросы