2016-08-10 2 views
1

Um die Gruntfile DRY zu behalten, würde ich gerne Optionen basierend auf der Umgebung ändern, für die ich eine Grunt-Aufgabe ausführe.grunt umgebungsspezifische Optionen für eine Aufgabe

So zum Beispiel, wenn ich will zwei Grunzen Aufgaben verwenden:

grunt.task.run('uglify:production'); 
grunt.task.run('uglify:development'); 

Ich möchte sie beide die gleichen Dateien kompilieren, jedoch mit unterschiedlichen Optionen.

uglify: { 

    production: { 
    options: { 
     compress: true 
    } 
    } 

    development: { 
    options: { 
     compress: false, 
     beautify: true 
    } 
    } 

    // rather not redeclare these files twice 
    files: { 

    vendor: { 
     // this name should change based on the environment 
     'dest/vendor-output.js': ['src/vendor-input1.js', 'src/vendor-input2.js'] 
    }, 
    custom: { 
     'dest/custom-output.js': ['src/custominput1.js', 'src/custominput2.js'] 
    } 

} 

Wenn die Produktion könnte sogar die Zielnamen, um benutzerdefinierte-output.min.js hat, die noch mehr ideal wäre.

Versuchte eine if-else-Anweisung, aber innerhalb der Grunt-Taskdefinition, die nicht fliegt.

Antwort

1

Da die Grunt-Konfiguration nur Json ist, können Sie Grunt-Vorlagen verwenden und haben Ihre Dateien als eine Eigenschaft der Konfig.

uglifyFiles: { 

    vendor: { 
    // this name should change based on the environment 
    'dest/vendor-output.js': ['src/vendor-input1.js', 'src/vendor-input2.js'] 
    }, 
    custom: { 
    'dest/custom-output.js': ['src/custominput1.js', 'src/custominput2.js'] 
    } 
}, 
uglify: { 

    production: { 
    options: { 
     compress: true 
    }, 
    files: '<%= uglifyFiles %>' 
    }, 

    development: { 
    options: { 
     compress: false, 
     beautify: true 
    }, 
    files: '<%= uglifyFiles %>' 
    } 
} 

http://gruntjs.com/configuring-tasks#templates

Traurig bin nicht ganz auf diese Frage verstehen

If production could even have the destination name to custom-output.min.js that would be even more ideal.

Könnten Sie ein wenig mehr Informationen geben, oder ist die über das, was Sie wo zu erreichen versuchen?

EDIT

Scheint wie das, was Sie versuchen, den Wiederholungsteil aus DRY zu tun nimmt, wie Sie tatsächlich in jeder etwas anderen Code möchten. Es könnte getan werden, aber nicht in der JSON, müssten Sie js verwenden und Bracket-Notation verwenden, um das Ziel als einen Schlüssel zu erstellen. Ich denke, ein viel einfacherer Weg, und was für ein Grunzen für so eingerichtet wird, wäre folgendes zu tun.

vendorUglifyFiles: ['src/vendor-input1.js', 'src/vendor-input2.js'], 
customUglifyFiles: ['src/custominput1.js', 'src/custominput2.js'], 
uglify: { 

    production: { 
    options: { 
     compress: true 
    }, 
    files: { 
     vendor: { 
     'dest/vendor.min.js': '<%= vendorUglifyFiles %>' 
     }, 
     custom: { 
     'dest/custom.min.js': '<%= customUglifyFiles %>' 
     } 
    } 
    }, 

    development: { 
    options: { 
     compress: false, 
     beautify: true 
    }, 
    files: { 
     vendor: { 
     'dest/vendor.js': '<%= vendorUglifyFiles %>' 
     }, 
     custom: { 
     'dest/custom.js': '<%= customUglifyFiles %>' 
     } 
    } 
    } 
} 

Edit: 2016.11.08, 15:12

das Niveau entfernt, das die indexOf Fehler auslöst:

vendorUglifyFiles: ['src/vendor-input1.js', 'src/vendor-input2.js'], 
customUglifyFiles: ['src/custominput1.js', 'src/custominput2.js'], 
uglify: { 

    production: { 
    options: { 
     compress: true 
    }, 
    files: { 
     'dest/vendor.min.js': '<%= vendorUglifyFiles %>', 
     'dest/custom.min.js': '<%= customUglifyFiles %>' 
    } 
    }, 

    development: { 
    options: { 
     compress: false, 
     beautify: true 
    }, 
    files: { 
     'dest/vendor.js': '<%= vendorUglifyFiles %>', 
     'dest/custom.js': '<%= customUglifyFiles %>' 
    } 
    } 
} 

, dass der Trick funktioniert.

+0

Ich versuche eine Aufgabe zu kompilieren, entweder in a verkleinerte Produktionsversion oder eine normale verschönerte Entwicklungsversion der Dateien. Das Beispiel, das du geschrieben hast, funktioniert für den ersten Teil. Jetzt sollten nur die Dateinamen entweder vendor.js für Entwicklung oder vender.min.js für die Produktionsversion sein. – Remi

+1

Es scheint, dass die Verschachtelung von 'vendor' und' custom' unterhalb der 'production'-Aufgabe einen 'Warning: pattern.indexOf ist keine Funktion'-Fehler auslöst. Das Entfernen dieses zusätzlichen Levels macht den Trick. – Remi

+0

Ahh Entschuldigung, tippen auswendig, danke fürs Reparieren. –

0

Grunt ist Javascript, Sie können also IF/ELSE-Anweisungen hinzufügen.

Beispiel:

files: { 
    (() => { 
     if (grunt.option('vendor')) { 
      return { 
       'dest/vendor-output.js': ['src/vendor-input1.js', 'src/vendor-input2.js'] 
      } 
     } else (grunt.option('release')) { 
      return { 
       'dest/custom-output.js': ['src/custominput1.js', 'src/custominput2.js'] 
      } 
     } 
    }()) 
} 

/*** 
* OR SOMETHING LIKE 
**/ 

files: { 
    (() => { 
     switch(grunt.option) { 
      case 'vendor': 
       return { 
        'dest/vendor-output.js': ['src/vendor-input1.js', 'src/vendor-input2.js'] 
       }; 
       break; 
      case 'release: 
       return { 
        'dest/custom-output.js': ['src/custominput1.js', 'src/custominput2.js'] 
       }; 
       break; 
      default: 
       return {}; 
     } 
    } 
} 

Natürlich müssen Sie diese auf die gewünschte Situation ändern, weil es jetzt unknow ist, wie Sie Anbieter und/oder Release-Adresse.

+0

Sollten nicht die Produktions- und Entwicklungsoptionen in diesem Zustand gefangen sein, basierend auf der Grunt-Aufgabe 'higify: production' oder' heigh: development'? – Remi

+0

Das ist auch möglich. Sie können auch eine Variable wie folgt einstellen: 'grunt uglify --type = production' und sie sammeln mit:' grunt.option ('type') // = production' –

Verwandte Themen