Top Banner
AUTOMATISIERUNG MIT GRUNT AUTOMATISIERUNG MIT GRUNT Christian Herberger
40

Automatisierung mit grunt

Aug 04, 2015

Download

Internet

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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