Automatisierung mit grunt

40
AUTOMATISIERUNG MIT GRUNT AUTOMATISIERUNG MIT GRUNT Christian Herberger

Transcript of Automatisierung mit grunt

Page 1: Automatisierung mit grunt

AUTOMATISIERUNG MIT GRUNTAUTOMATISIERUNG MIT GRUNTChristian Herberger

Page 2: Automatisierung mit grunt

ÜBER MICHÜBER MICHIntegratorPHP-EntwicklerFE-Entwickler

Page 3: Automatisierung mit grunt

PUNKT.DEPUNKT.DETYPO3-Komplettpakete in Karlsruhe~30 Mitarbeiter

Page 4: Automatisierung mit grunt

DER ROTE FADENDER ROTE FADENWas ist Grunt und was kann es?Workflow für eine Applikation innerhalb einer Website

Tasks installieren und konfigurierenTask-KombinationenEigene Tasks

Ausführung von GruntAusblick

Page 5: Automatisierung mit grunt

GRUNTGRUNTDas nützliche Warzenschwein

Page 6: Automatisierung mit grunt

WAS IST GRUNTWAS IST GRUNTThe JavaScript Task Runner

Automatisierung von wiederkehrenden AufgabenFertige Plugins für viele WerkzeugeTask-Abhängigkeiten/ReihenfolgenÜberwachung des Codes auf ÄnderungenEigene Tasks einfach möglich

Page 7: Automatisierung mit grunt

BENUTZUNGBENUTZUNG... wird im Rahmen des Beispiels gezeigt

Page 8: Automatisierung mit grunt

EINFACHER WORKFLOWEINFACHER WORKFLOW2 Extensions - Sitepackage mit SCSS und Standard-JavaScript & Extension mit Angular-AppZiel: Eine CSS-Datei, eine JS-Datei für die AppJavaScript im Footer, Inlinescript muss funktionieren

Page 9: Automatisierung mit grunt

INSTALLATION DER RELEVANTEN TOOLSINSTALLATION DER RELEVANTEN TOOLS

Page 10: Automatisierung mit grunt

NPMNPMMac: Per Brew, ports, ...Linux: apt, yum, ...BSD: pkg, ...Win: Node und NPM von der Website laden undinstallieren (läuft!)

Nur einmal auf dem Rechner notwendig

Page 11: Automatisierung mit grunt

COMPASSCOMPASS (DER AUFWÄNDIGSTE TEIL) (DER AUFWÄNDIGSTE TEIL)Ruby installierenCompass mit gem installieren

Andere Compiler sind möglich, nachher aufpassenNur einmal auf dem Rechner notwendig

Page 12: Automatisierung mit grunt

NPM-PAKETE GLOBALNPM-PAKETE GLOBAL(sudo) npm install -g grunt-cli

Nur einmal auf dem Rechner notwendig

Page 13: Automatisierung mit grunt

NPM-PAKETE IM PROJEKTNPM-PAKETE IM PROJEKTcd /projektverzeichnis/htdocs/typo3conf/ext/pt_site_base && npm init

npm install [paketname]

Einmal pro Projekt notwendig

Page 14: Automatisierung mit grunt

LISTE DER PAKETE IM PROJEKTLISTE DER PAKETE IM PROJEKTgrunt: Lokale Grunt-Instanz zum Ausführen der Tasksgrunt-contrib-clean: Verzeichnisse leerengrunt-contrib-compass: Compass aufrufengrunt-contrib-concat: Dateien zusammenführen, ohneden Inhalt zu veränderngrunt-contrib-copy: Dateien von A nach B kopierengrunt-contrib-uglify: JavaScript minifyengrunt-contrib-watch: Dateien überwachen und Tasksstartengrunt-ng-annotate: AngularJS-Minify-Hilfe

Page 15: Automatisierung mit grunt

LISTE DER PAKETE IM PROJEKTLISTE DER PAKETE IM PROJEKTWandert alles nach package.json und node_modules/Nur die package.json muss ins VCSAndere Entwickler benötigen nur

npm install

Page 16: Automatisierung mit grunt

WEITERE VORBEREITUNGENWEITERE VORBEREITUNGEN

Page 17: Automatisierung mit grunt

ORDNER-/DATEISTRUKTURORDNER-/DATEISTRUKTURAlle Entwicklungsdateien in Resources/PrivateResources/Public nach .gitignoreAlles SASS (weil Projekt-abhängig und nicht für dieAnwendung) in der base-ExtensionJavaScript trennen nach Base, App und JSQueue (fürspäteres Ausführen von beliebigem JS)

Page 18: Automatisierung mit grunt

COMPASS: CONFIG.RBCOMPASS: CONFIG.RBEine valide config.rb kann sowohl für Compass selbst als

auch für Grunt verwendet werden

Page 19: Automatisierung mit grunt

JSQUEUEJSQUEUEKleines JavaScript im Header, welches Inline-JavaScriptzur verspäteten Ausführung queuen kannKleines JavaScript im Footer, welches die gequeuetenScripte ausführt und an jQuery weitergibt¡Anwendung: JavaScript, welches auf Libraries zugreift(jQuery!!!)

Page 20: Automatisierung mit grunt

GRUNTFILE.JSGRUNTFILE.JSDer Schlüssel des Erfolgs

Page 21: Automatisierung mit grunt

TASKS LADENTASKS LADENgrunt.loadNpmTasks('grunt-contrib-concat');grunt.loadNpmTasks('grunt-contrib-uglify');grunt.loadNpmTasks('grunt-contrib-watch');grunt.loadNpmTasks('grunt-contrib-compass');grunt.loadNpmTasks('grunt-contrib-copy');grunt.loadNpmTasks('grunt-contrib-clean');grunt.loadNpmTasks('grunt-ng-annotate');

Page 22: Automatisierung mit grunt

ORDNER-/DATEILISTEORDNER-/DATEILISTEListe nur einmal definieren und immer wieder verwendenAlle Pfade relativ zum Gruntfile, werden so geschriebendass von ext/ aus geprüft wirdReihenfolge wird beachtetDuplikate werden nur einmal (das erste mal) verwendet

Page 23: Automatisierung mit grunt

CLEANCLEANclean: {

options: {force: true

},workingDirectory:[

'<%= filePaths.workingDirectory %>'],baseJavaScript: [

'<%= filePaths.baseJavaScript.dest %>'],siteApp: [

'<%= filePaths.siteApp.dest %>']

},

Page 24: Automatisierung mit grunt

NGANNOTATENGANNOTATEngAnnotate: {

options: {singleQuotes: true

},siteApp: {

files: {'<%= filePaths.workingDirectory %>/annotated.js': [

}}

},

Page 25: Automatisierung mit grunt

UGLIFYUGLIFYuglify: {

baseJavaScript: {files: {

'<%= filePaths.workingDirectory %>/uglify.js': ['<%= filePaths.bas}

},angularApp: {

files: {'<%= filePaths.workingDirectory %>/uglify.js': ['<%= filePaths.wor

}}

},

Page 26: Automatisierung mit grunt

CONCATCONCATconcat: {

baseJavaScript: {files: {

'<%= filePaths.workingDirectory %>/base.min.js': [}

},angularApp: {

files: {'<%= filePaths.workingDirectory %>/app.min.js': [

}},angularAppDev: {

files: {'<%= filePaths.workingDirectory %>/app.min.js': [

}}

},

Page 27: Automatisierung mit grunt

COPYCOPYcopy: {

baseJavaScript: {files: [

{expand: true,cwd: '<%= filePaths.workingDirectory %>',src: ['base.min.js'],dest: '<%= filePaths.baseJavaScript.dest %>'

},{

expand: true,cwd: '../../../pt_site_base/Resources/Private/JavaScript/Jsrc: ['OnReadyInit.js', 'OnReadyRun.js'],dest: '<%= filePaths.baseJavaScript.dest %>'

}]

},siteApp: {

files: [{

expand: true,cwd: '<%= filePaths.workingDirectory %>',src: ['app.min.js'],dest: '<%= filePaths.siteApp.dest %>'

}]

Page 28: Automatisierung mit grunt

},

Page 29: Automatisierung mit grunt

COMPASSCOMPASScompass: {

stylesheets: {options: {

config: 'config.rb'}

}},

Page 30: Automatisierung mit grunt

WATCHWATCHwatch: {

baseJavaScript: {files: ['<%= filePaths.baseJavaScript.src %>'],tasks: 'baseJavaScript'

},styleheets: {

files: ['<%= filePaths.stylesheets.src %>'],tasks: 'compass'

},siteApp: {

files: ['<%= filePaths.siteApp.src %>'],tasks: 'siteAppDev'

}}

Page 31: Automatisierung mit grunt

EIGENE TASKS IN GRUNTEIGENE TASKS IN GRUNTTun und lassen, was man will (und braucht)

Page 32: Automatisierung mit grunt

KOMBINIERTE TASKS MIT ABHÄNGIGKEITKOMBINIERTE TASKS MIT ABHÄNGIGKEITgrunt.registerTask('baseJavaScript', ['clean:baseJavaScript','clean:workingDirectory'

grunt.registerTask('siteApp', 'build production ready app', function(parameter){grunt.task.run('clean:siteApp');grunt.task.run('clean:workingDirectory');grunt.task.run('ngAnnotate:siteApp:' + parameter);grunt.task.run('uglify:angularApp');grunt.task.run('concat:angularApp');grunt.task.run('copy:siteApp');grunt.task.run('clean:workingDirectory');

});

Page 33: Automatisierung mit grunt

KOMBINIERTE TASKS MIT ABHÄNGIGKEITKOMBINIERTE TASKS MIT ABHÄNGIGKEIT(REKURSIV!)(REKURSIV!)

// Default task.grunt.registerTask('default', 'build everything production ready', function

grunt.task.run('baseJavaScript');grunt.task.run('siteApp');

});

grunt.registerTask('dev', 'build everything for development', function(){grunt.task.run('baseJavaScript');grunt.task.run('siteAppDev');

});

grunt.registerTask('w', ['dev', 'watch']);

Page 34: Automatisierung mit grunt

EIGENE TASKS MIT PARAMETERNEIGENE TASKS MIT PARAMETERNgrunt.registerTask('helloWorld','',function(name){

grunt.log.write('running hello world with argument: ' + name + '\n'

grunt.file.write('./helloWorld.json', 'alert("Hello ' + name + '");'});

Page 35: Automatisierung mit grunt

AUSFÜHRUNG VON GRUNTAUSFÜHRUNG VON GRUNTDas wichtigste überhaupt!

Page 36: Automatisierung mit grunt

AUSFÜHREN VON TASKSAUSFÜHREN VON TASKSgrunt -> Default-Taskgrunt dev -> Dev-Taskgrunt siteApp -> SiteApp-Taskgrunt helloWorld:name -> HelloWorld mit Name

Geht auch alles mit -v (verbose)

Page 37: Automatisierung mit grunt

AUSFÜHREN VON TASKSAUSFÜHREN VON TASKSUltimativ: Grunt-Konsole in phpStorm (vielleicht mit grunt-

notify)

Page 38: Automatisierung mit grunt

AUSBLICKAUSBLICK

Page 39: Automatisierung mit grunt

Fragen? Antworten! Diskussion?

Page 40: Automatisierung mit grunt

Vielen Dank für die Aufmerksamkeit!https://github.com/kabarakh/t3cs15/http://de.slideshare.net/Kabarakh1/automatisierung-mit-grunthttps://speakerdeck.com/kabarakh/automatisierung-mit-grunt