2017-12-13 4 views
0

In einem eckigen Projekt, das mit Yeoman gestartet wurde, haben wir json-Dateien (dev, test, dist ...) mit den Konstanten, die für jede Umgebung benötigt werden, damit die Grunt-Serve-Aufgabe definiert wird wie:Grunt ngconstant: Generierung aus mehreren austauschbaren Dateien

grunt.registerTask('serve', function(environment) { 
    grunt.task.run([ 
    ... 
    'ngconstant:'+environment, 
    ... 
    ]); 
}); 

und dann in ngconstant haben wir:

ngconstant: { 
    options: { 
    name: 'environment', 
    dest: ... 
    }, 
    dev: { 
    constants: { 
     'ENV': grunt.file.readJSON('environments/dev.json') 
    } 
    }, 
    test: { 
    constants: { 
     'ENV': grunt.file.readJSON('environments/test.json') 
    } 
    }, 
    ... 
    } 
} 

, so dass es mit grunt serve:dev ausgeführt werden kann, grunt serve:test ...

Jetzt müssen wir auch bestimmte Aspekte der Anwendung ändern, auf einem zweiten Kriterien abhängig (seien wir Anwenderziel nennen), in einer Weise, dass es wie grunt serve:dev:target1 gebaut werden konnte, grunt serve:test:target2 ...

Kann dies mit ngconstant erfolgen ? Die einzige ähnliche Idee, die ich bisher hatte, war Ziele wie dev-target1, dev-target2, test-target1 zu definieren ... wo jeder ENV zu einer Datei und TARGET zum anderen, aber das ist nicht skalierbar (wir arbeiten mit nur zwei Zielen, aber wir erwarten mehr kommt bald) und einfach nur hässlich.

Antwort

0

Ok, einen Weg gefunden, dies zu tun. ngconstant im Gruntfile:

ngconstant: { 
    dev: { 
    options: { 
     name: 'environment', 
     dest: '<%= yeoman.app %>/js/modules/environment/config/environment.js' 
    }, 
    constants: { 
     'ENV': grunt.file.readJSON('environments/dev.json') 
    } 
    }, 
    test: { 
    options: { 
     name: 'environment', 
     dest: '<%= yeoman.app %>/js/modules/environment/config/environment.js' 
    }, 
    constants: { 
     'ENV': grunt.file.readJSON('environments/test.json') 
    } 
    }, 
    prod: { 
    options: { 
     name: 'environment', 
     dest: '<%= yeoman.app %>/js/modules/environment/config/environment.js' 
    }, 
    constants: { 
     'ENV': grunt.file.readJSON('environments/prod.json') 
    } 
    }, 
    local: { 
    options: { 
     name: 'environment', 
     dest: '<%= yeoman.app %>/js/modules/environment/config/environment.js' 
    }, 
    constants: { 
     'ENV': grunt.file.readJSON('environments/local.json') 
    } 
    }, 
    superior: { 
    options: { 
     name: 'target', 
     dest: '<%= yeoman.app %>/js/modules/target/config/target.js' 
    }, 
    constants: { 
     'TGT': grunt.file.readJSON('targets/superior.json') 
    } 
    }, 
    profesional: { 
    options: { 
     name: 'target', 
     dest: '<%= yeoman.app %>/js/modules/target/config/target.js' 
    }, 
    constants: { 
     'TGT': grunt.file.readJSON('targets/profesional.json') 
    } 
    }, 
} 

Es ist chaotisch, weil alles zusammen im selben Modul gebündelt ist, aber die serve Aufgabe wie folgt definiert ist:

grunt.registerTask('serve', function(environment, target) { 
grunt.task.run([ 
    ... 
    'ngconstant:'+environment, 
    'ngconstant:'+target, 
    ... 
]); 

});

und es wie grunt serve:dev:superior Aufruf wird die environment/config/environment.js Datei mit dem „dev“ ENV Konstanten und dann der target/config/target.js Datei mit den „superior“ TGT Konstanten wie definiert in ihren jeweiligen Dateien zuerst erzeugen.

Ich habe versucht, die gleiche Zieldatei für beide Typen zu setzen, aber die Datei wird überschrieben anstelle von angehängten Konstanten oder ähnlichem.

Verwandte Themen