2013-03-26 8 views
6

Ho un paio di compiti grugnito e sto cercando di condividere le variabili globali tra i compiti e io sono in esecuzione in problemi.Usa Globali variabile da impostare costruire percorso di uscita in Grunt

ho scritto un alcuni attività personalizzate che definiscono il percorso di uscita adeguata a seconda del tipo di costruzione. Questo sembra impostare le cose correttamente.

// 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); 
}); 

Quindi, sto cercando di quindi fare riferimento global.outputPath in un'attività successiva, e in esecuzione in errori.

Se chiamo grunt test dalla linea di comando, esso emette il percorso corretto nessun problema.

Tuttavia, se ho un compito come questo: pulito: { rilascio: { src: global.outputPath }}

Si getta il seguente errore: Warning: Cannot call method 'indexOf' of undefined Use --force to continue.

Inoltre, le mie costanti nel compito SetOutput sono fissati nella parte superiore dei miei Gruntfile.js

Qualche idea? Sto facendo qualcosa di sbagliato qui?

+0

Sto pensando che potrebbe essere correlato al global.outputPath impostato al di fuori di grunt.initConfig ({}), mentre, sto provando ad accedere alla variabile all'interno di grunt.initConfig ({}) – ThePuzzleMaster

risposta

13

Così, ero sulla strada giusta. Il problema è che il modulo esporta prima che vengano impostate le variabili globali, quindi sono tutte indefinite nelle attività successive definite all'interno dell'attività initConfig().

La soluzione mi è venuta, anche se, ci può essere migliore, è quello di sovrascrivere un valore grunt.option.

devo un'opzione facoltativa per il mio compito --target

soluzione di lavoro assomiglia a questo:

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")); 
}); 

E il compito definito initconfig() si presentava così:

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

Sentiti libero di suonare se hai una soluzione migliore. Altrimenti, forse questo potrebbe aiutare qualcun altro.

+1

Mi piace l'idea di impostare la directory di destinazione della build a livello globale. L'alternativa è definire regole separate per ogni processo solo perché la destinazione è diversa. (es .: 'sass: dev',' coffee: dev', 'sass: dist',' coffee: dist'). È un dolore e non molto ASCIUTTO. Grazie per aver fatto il lavoro alle gambe su questo! – SimplGy

+0

Sono confuso dal bit in cui stai impostando 'global.Outputpath' uguale a' grunt.option ('target') 'se è definito, quindi impostando' grunt.option ('target') 'sul valore di 'global.Outputpath'. Qual è la tua intenzione lì? – SimplGy

+0

Ahhh. Guardandolo ora, il modo migliore sarebbe quello di inserire un ritorno sulla prima riga di quella funzione se l'opzione ("target") è stata impostata in fase di esecuzione. Altrimenti, sto impostando global.Outputpath su grunt.option ("target") in modo che se passano in un target in fase di esecuzione, sostituisce tutti i valori predefiniti. – ThePuzzleMaster

4

Ho un modo per farlo che consente di specificare il percorso di uscita utilizzando valori come --dev. Finora funziona molto bene, mi piace abbastanza. Ho pensato di condividerlo, come piace a qualcun altro.

# 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() 

Con questa configurazione, è possibile eseguire comandi come:

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

Il tuo Gruntfile è un coffescript? Link al setup/howto per favore :) Un buon consiglio btw – oligofren

0

Questa è una domanda più vecchio, ho pensato di gettare i miei 5 centesimi.

Se avete bisogno di variabili di configurazione per essere accessibile da qualsiasi compito, basta definire nel vostro principale (quello che avrete sempre caricare) file di configurazione in questo modo:

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) 
} 

allora si può semplicemente accedere al valore in questo modo:

  • nel file di configurazione (s)

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

  • in compiti

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

ho usato chiave options qui solo per essere in linea con la convenzione, ma si può usare qualsiasi cosa, purché non si ricorda di registrare un compito chiamato 'options' o Qualunque cosa tu abbia usato per la chiave :)

Problemi correlati