2013-03-26 9 views
6

Ich habe ein paar Grunt-Aufgaben, und ich versuche, globale Variablen über diese Aufgaben hinweg zu teilen, und ich stoße auf Probleme.Verwenden Sie die globale Variable zum Festlegen des Build-Ausgabepfads in Grunt

Ich habe einige benutzerdefinierte Aufgaben geschrieben, die den richtigen Ausgabepfad je nach Buildtyp festlegen. Dies scheint die Dinge richtig einzustellen.

// Set Mode (local or build) 
grunt.registerTask("setBuildType", "Set the build type. Either build or local", function (val) { 
    // grunt.log.writeln(val + " :setBuildType val"); 
    global.buildType = val; 
}); 

// SetOutput location 
grunt.registerTask("setOutput", "Set the output folder for the build.", function() { 
    if (global.buildType === "tfs") { 
    global.outputPath = MACHINE_PATH; 
    } 
    if (global.buildType === "local") { 
    global.outputPath = LOCAL_PATH; 
    } 
    if (global.buildType === "release") { 
    global.outputPath = RELEASE_PATH; 
    } 
    if (grunt.option("target")) { 
    global.outputPath = grunt.option("target"); 
    } 
    grunt.log.writeln("Output folder: " + global.outputPath); 
}); 

grunt.registerTask("globalReadout", function() { 
    grunt.log.writeln(global.outputPath); 
}); 

Also, ich versuche, dann zu verweisen global.outputPath in einer nachfolgenden Aufgabe, und läuft in Fehler.

Wenn ich grunt test über die Befehlszeile aufrufen, gibt es den richtigen Pfad kein Problem.

Allerdings, wenn ich eine Aufgabe, wie dieses: sauber: { release: { src: global.outputPath } }

Es wird folgende Fehler wirft: Warning: Cannot call method 'indexOf' of undefined Use --force to continue.

Auch Meine Konstanten in der SetOutput Aufgabe werden oben auf meiner Gruntfile.js gesetzt

Irgendwelche Gedanken? Mache ich hier etwas falsch?

+0

Ich denke, es könnte mit dem global.outputPath im Zusammenhang stehen außerhalb von grunt.initConfig ({}), während ich versuche, auf die Variable in grunt.initConfig zugreifen ({}) – ThePuzzleMaster

Antwort

13

Also, ich war auf dem richtigen Weg. Das Problem besteht darin, dass das Modul exportiert wird, bevor diese globalen Variablen festgelegt werden. Daher sind sie alle in nachfolgenden Tasks, die in der Task initConfig() definiert sind, undefiniert.

Die Lösung, die ich gefunden habe, obwohl es vielleicht besser ist, ist eine grunt.option Wert zu überschreiben.

Ich habe eine optionale Option für meine Aufgabe wie diese --target

Arbeitslösung aussieht:

grunt.registerTask("setOutput", "Set the output folder for the build.", function() { 
    if (global.buildType === "tfs") { 
    global.outputPath = MACHINE_PATH; 
    } 
    if (global.buildType === "local") { 
    global.outputPath = LOCAL_PATH; 
    } 
    if (global.buildType === "release") { 
    global.outputPath = RELEASE_PATH; 
    } 
    if (grunt.option("target")) { 
    global.outputPath = grunt.option("target"); 
    } 

    grunt.option("target", global.outputPath); 
    grunt.log.writeln("Output path: " + grunt.option("target")); 
}); 

Und die Aufgabe in InitConfig() sah wie folgt definiert:

clean: { 
    build: { 
    src: ["<%= grunt.option(\"target\") %>"] 
    } 
} 

Fühlen Sie sich frei zu schlagen, wenn Sie eine bessere Lösung haben. Andernfalls könnte dies vielleicht einem anderen helfen.

+1

Ich mag die Idee, das Zielverzeichnis des Builds global zu setzen. Die Alternative besteht darin, separate Regeln für jeden Prozess zu definieren, nur weil das Ziel anders ist. (zB: 'sass: dev',' kaffee: dev', 'sass: dist',' kaffee: dist'). Es ist ein Schmerz und nicht sehr trocken. Danke, dass du die Beinarbeit dafür gemacht hast! – SimplGy

+0

Ich bin verwirrt durch das Bit, wo Sie 'global.Outputpath' gleich 'grunt.option ('target')' wenn es definiert ist, dann setzen 'grunt.option ('target')' auf den Wert von 'global.Outputpath'. Was ist deine Absicht dort? – SimplGy

+0

Ahhh. Wenn wir es jetzt betrachten, wäre der bessere Weg, eine Rückkehr in die erste Zeile dieser Funktion zu setzen, wenn die Option ("Ziel") zur Laufzeit gesetzt wäre. Ansonsten setze ich global.Outputpath auf grunt.option ("target"), damit, wenn sie zur Laufzeit ein Ziel übergeben, alle Standardwerte überschrieben werden. – ThePuzzleMaster

4

Ich habe eine Möglichkeit, dies zu tun, die Sie den Ausgabepfad mit Werten wie --dev angeben können. Bis jetzt funktioniert es sehr gut, ich mag es sehr. Ich dachte, ich würde es teilen, wie es auch ein anderer mag.

# Enum for target switching behavior 
    TARGETS = 
     dev: 'dev' 
     dist: 'dist' 

    # Configurable paths and globs 
    buildConfig = 
     dist: "dist" 
     dev: '.devServer' 
     timestamp: grunt.template.today('mm-dd_HHMM') 

    grunt.initConfig 
     cfg: buildConfig 
     cssmin: 
      crunch: 
       options: report: 'min' 
       files: "<%= grunt.option('target') %>/all-min.css": "/**/*.css" 

    # Set the output path for built files. 
    # Most tasks will key off this so it is a prerequisite 
    setPath = -> 
     if grunt.option 'dev' 
     grunt.option 'target', buildConfig.dev 
     else if grunt.option 'dist' 
     grunt.option 'target', "#{buildConfig.dist}/#{buildConfig.timestamp}" 
     else # Default path 
     grunt.option 'target', buildConfig.dev 
     grunt.log.writeln "Output path set to: `#{grunt.option 'target'}`" 
     grunt.log.writeln "Possible targets:" 
     grunt.log.writeln target for target of TARGETS 

    setPath() 

Mit diesem Setup können Sie Befehle wie auszuführen:

grunt cssmin --dist #sent to dist target 
grunt cssmin --dev #sent to dev target 
grunt cssmin --dev #sent to default target (dev) 
+2

Ihre Gruntfile ist Coffescript? Link zum Setup/Howto bitte :) Netter Tipp übrigens – oligofren

0

Dies ist eine ältere Frage, dachte ich nur in meinem 5 Cent zu werfen.

Wenn Sie Config-Variable von jeder Aufgabe zugänglich zu sein, definieren es nur in der Haupt (die, die Sie immer laden) Config-Datei wie folgt aus:

module.exports = function(grunt) 
{ 
    // 
    // Common project configuration 
    // 
    var config = 
    { 
     pkg: grunt.file.readJSON('package.json'), 

     options: // for 'project' 
     { 
      dist: 
      { 
       outputPath: '<%= process.cwd() %>/lib', 
      }, 
      dev: 
      { 
       outputPath: '<%= process.cwd() %>/build', 
      }, 
     }, 
    } 

    grunt.config.merge(config) 
} 

Dann können Sie einfach Wert zugreifen wie folgt aus:

  • in der Konfigurationsdatei (en)

... my_thingie: [ ends_up_here: '<%= options.dev.outputPath %>/bundle', ], ...

  • in Aufgaben

// as raw value grunt.config.data.options.dist.outputPath // after (eventual) templates have been processed grunt.config('options.dist.outputPath')

Ich benutzen Schlüssel options hier nur mit der Konvention in Einklang zu sein, aber man kann alles verwenden, solange du noch keine Aufgabe 'options' namens registrieren oder Was immer Sie für den Schlüssel verwendet haben :)

Verwandte Themen