2015-12-31 2 views
5

Hier ist ein Beispiel dafür, was ich suche:Können Sie eine Grunt-Variable an eine JavaScript-Funktion in einer Grunt-Aufgabe übergeben?

module.exports = function(grunt) { 
    grunt.initConfig({ 

    config: grunt.file.readYAML('_config.yml'), 
    // example variable: <%= config.scripts %> 

    copy: { 
     scripts: (function() { 
     if (config.scripts === true) { // I want to target <%= config.scripts %> 
      return { 
      expand: true, 
      cwd: '<%= input %>/_assets/js/', 
      src: '**/*.js', 
      dest: '<%= output %>/assets/js/' 
      }; 
     } else { 
      return { 
      // do nothing 
      }; 
     } 
     })() 
    } 

    }); 
}; 

Ich weiß Grunt die Daten innerhalb einer Datei ‚grunt.file.readJSON‘ mit lesen können, und haben dann die verfügbaren Daten mit der folgenden Typ der Variablen, '<% = pkg.value%>'.

Was ich tun möchte, ist eine Aufgabe mit If/Else-Optionen basierend auf den Variablen aus der JSON-Datei zu erstellen. Was ich nicht verstehe, ist, wie man eine Grunt-Variable '<% = pkg.value%>' in die JavaScript if-Anweisung in einer Weise eingibt, die sie versteht. Ich habe versucht, es im gleichen Grunt-Format mit "<% =%>" zu übergeben, sowie diesen Teil wegzuziehen und 'pkg.value' zu übergeben, aber keiner scheint zu funktionieren.

Wenn jemand etwas Licht darauf werfen kann, ob und wie dies getan werden kann, würde ich es sehr schätzen. Vielen Dank!

+1

Können Sie bitte ein konkretes Beispiel für Ihre Grunt-Aufgabe angeben? (Ersetzen Sie die Kommentare "tue etwas" mit Ihrer Aufgabe) –

+0

Siehe das oben bearbeitete Beispiel. –

+0

Danke. Ich poste eine Antwort. Versuch es. –

Antwort

1

Wenn ich mehr Zeit habe, werde ich wahrscheinlich einige zusätzliche Ideen schauen, sondern auf der Grundlage der Ideen, die hier angeboten werden, das ist, was ich mit jetzt gehen landete.

module.exports = function(grunt) { 

    var config = grunt.file.readYAML('_config.yml'); 

    grunt.initConfig({ 

    copy: { 
     scripts: (function() { 
     if (config.scripts) { 
      return { 
      expand: true, 
      cwd: 'input/_assets/js/', 
      src: '**/*.js', 
      dest: 'output/assets/js/' 
      }; 
     } else { 
      return { 
      // do nothing 
      }; 
     } 
     })() 
    } 

    }); 
}; 

Dank, jeder, für Ihre Hilfe!

0

Grunt hat eine API-Dateien zu lesen, was Sie so etwas wie diese verwenden:

test.json

{ 
    "fruit": "apple" 
} 

Gruntfile.js

module.exports = function(grunt) { 

    grunt.initConfig({ 
    ... 
    }) 

    grunt.registerTask('sample-task', function() { 
    var test = grunt.file.readJSON('./test.json'); 

    if (test.fruit === 'apple') { 
     // do this one thing 
    } else { 
     // do something else 
    } 

    }); 

    grunt.registerTask('default', ['sample-task']); 
}; 
+0

Können Sie teilen, wie ich dies verwenden könnte, um zu sagen, wenn eine Variable in der "test.json" -Datei auf true gesetzt ist, führen Sie taskA aus, oder wenn es falsch ist, führen Sie taskB aus? Ich habe auch mein Beispiel in der ursprünglichen Frage als Referenz aktualisiert. Vielen Dank! –

+0

da gehst du hin! Sie erhalten nur ein JSON-Objekt, sodass Sie es als normales JS-Objekt behandeln können – alexdmejias

1

Anstatt das Grunzen direkt zuweisen Konfiguration in config Attribut, speichern Sie es in einer Variablen (gruntConfig). Jetzt können Sie im folgenden Code darauf zugreifen.

module.exports = function(grunt) { 
    // store your grunt config 
    var gruntConfig = grunt.file.readYAML('_config.yml'); 
    // init `script` with an empty object 
    var script = {}; 
    if (gruntConfig.script) { 
     script = { 
      expand: true, 
      cwd: '<%= input %>/_assets/js/', 
      src: '**/*.js', 
      dest: '<%= output %>/assets/js/' 
     }; 
    } 
    // Init Grunt configuration 
    grunt.initConfig({ 
     config: gruntConfig, 
     copy: { 
      scripts: script 
     } 
    }); 
};