Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Automatisierung mit Grunt

Automatisierung mit Grunt

Avatar for Kabarakh

Kabarakh

May 10, 2015
Tweet

Other Decks in Programming

Transcript

  1. DER ROTE FADEN DER ROTE FADEN Was ist Grunt und

    was kann es? Workflow für eine Applikation innerhalb einer Website Tasks installieren und konfigurieren Task-Kombinationen Eigene Tasks Ausführung von Grunt Ausblick
  2. WAS IST GRUNT WAS IST GRUNT The JavaScript Task Runner

    Automatisierung von wiederkehrenden Aufgaben Fertige Plugins für viele Werkzeuge Task-Abhängigkeiten/Reihenfolgen Überwachung des Codes auf Änderungen Eigene Tasks einfach möglich
  3. EINFACHER WORKFLOW EINFACHER WORKFLOW 2 Extensions - Sitepackage mit SCSS

    und Standard- JavaScript & Extension mit Angular-App Ziel: Eine CSS-Datei, eine JS-Datei für die App JavaScript im Footer, Inlinescript muss funktionieren
  4. NPM NPM Mac: Per Brew, ports, ... Linux: apt, yum,

    ... BSD: pkg, ... Win: Node und NPM von der Website laden und installieren (läuft!) Nur einmal auf dem Rechner notwendig
  5. COMPASS COMPASS (DER AUFWÄNDIGSTE TEIL) (DER AUFWÄNDIGSTE TEIL) Ruby installieren

    Compass mit gem installieren Andere Compiler sind möglich, nachher aufpassen Nur einmal auf dem Rechner notwendig
  6. LISTE DER PAKETE IM PROJEKT LISTE DER PAKETE IM PROJEKT

    grunt: Lokale Grunt-Instanz zum Ausführen der Tasks grunt-contrib-clean: Verzeichnisse leeren grunt-contrib-compass: Compass aufrufen grunt-contrib-concat: Dateien zusammenführen, ohne den Inhalt zu verändern grunt-contrib-copy: Dateien von A nach B kopieren grunt-contrib-uglify: JavaScript minifyen grunt-contrib-watch: Dateien überwachen und Tasks starten grunt-ng-annotate: AngularJS-Minify-Hilfe
  7. LISTE DER PAKETE IM PROJEKT LISTE DER PAKETE IM PROJEKT

    Wandert alles nach package.json und node_modules/ Nur die package.json muss ins VCS Andere Entwickler benötigen nur npm install
  8. ORDNER-/DATEISTRUKTUR ORDNER-/DATEISTRUKTUR Alle Entwicklungsdateien in Resources/Private Resources/Public nach .gitignore Alles

    SASS (weil Projekt-abhängig und nicht für die Anwendung) in der base-Extension JavaScript trennen nach Base, App und JSQueue (für späteres Ausführen von beliebigem JS)
  9. COMPASS: CONFIG.RB COMPASS: CONFIG.RB Eine valide config.rb kann sowohl für

    Compass selbst als auch für Grunt verwendet werden
  10. JSQUEUE JSQUEUE Kleines JavaScript im Header, welches Inline-JavaScript zur verspäteten

    Ausführung queuen kann Kleines JavaScript im Footer, welches die gequeueten Scripte ausführt und an jQuery weitergibt¡ Anwendung: JavaScript, welches auf Libraries zugreift (jQuery!!!)
  11. ORDNER-/DATEILISTE ORDNER-/DATEILISTE Liste nur einmal definieren und immer wieder verwenden

    Alle Pfade relativ zum Gruntfile, werden so geschrieben dass von ext/ aus geprüft wird Reihenfolge wird beachtet Duplikate werden nur einmal (das erste mal) verwendet
  12. CLEAN CLEAN clean: { options: { force: true }, workingDirectory:[

    '<%= filePaths.workingDirectory %>' ], baseJavaScript: [ '<%= filePaths.baseJavaScript.dest %>' ], siteApp: [ '<%= filePaths.siteApp.dest %>' ] },
  13. NGANNOTATE NGANNOTATE ngAnnotate: { options: { singleQuotes: true }, siteApp:

    { files: { '<%= filePaths.workingDirectory %>/annotated.js': [ } } },
  14. UGLIFY UGLIFY uglify: { baseJavaScript: { files: { '<%= filePaths.workingDirectory

    %>/uglify.js': ['<%= filePat } }, angularApp: { files: { '<%= filePaths.workingDirectory %>/uglify.js': ['<%= filePat } } },
  15. CONCAT CONCAT concat: { baseJavaScript: { files: { '<%= filePaths.workingDirectory

    %>/base.min.js': [ } }, angularApp: { files: { '<%= filePaths.workingDirectory %>/app.min.js': [ } }, angularAppDev: { files: { '<%= filePaths.workingDirectory %>/app.min.js': [ } } },
  16. COPY COPY copy: { baseJavaScript: { files: [ { expand:

    true, cwd: '<%= filePaths.workingDirectory %>', src: ['base.min.js'], dest: '<%= filePaths.baseJavaScript.dest %>' }, { expand: true, cwd: '../../../pt_site_base/Resources/Private/JavaSc src: ['OnReadyInit.js', 'OnReadyRun.js'], dest: '<%= filePaths.baseJavaScript.dest %>' } ] }, siteApp: { files: [ { expand: true, cwd: '<%= filePaths.workingDirectory %>', src: ['app.min.js'], dest: '<%= filePaths.siteApp.dest %>' } ]
  17. },

  18. WATCH WATCH watch: { baseJavaScript: { files: ['<%= filePaths.baseJavaScript.src %>'],

    tasks: 'baseJavaScript' }, styleheets: { files: ['<%= filePaths.stylesheets.src %>'], tasks: 'compass' }, siteApp: { files: ['<%= filePaths.siteApp.src %>'], tasks: 'siteAppDev' } }
  19. EIGENE TASKS IN GRUNT EIGENE TASKS IN GRUNT Tun und

    lassen, was man will (und braucht)
  20. KOMBINIERTE TASKS MIT ABHÄNGIGKEIT KOMBINIERTE TASKS MIT ABHÄNGIGKEIT grunt.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'); });
  21. KOMBINIERTE TASKS MIT ABHÄNGIGKEIT KOMBINIERTE 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']);
  22. EIGENE TASKS MIT PARAMETERN EIGENE TASKS MIT PARAMETERN grunt.registerTask('helloWorld','',function(name){ grunt.log.write('running

    hello world with argument: ' + name + '\n' grunt.file.write('./helloWorld.json', 'alert("Hello ' + name + '");' });
  23. AUSFÜHREN VON TASKS AUSFÜHREN VON TASKS grunt -> Default-Task grunt

    dev -> Dev-Task grunt siteApp -> SiteApp-Task grunt helloWorld:name -> HelloWorld mit Name Geht auch alles mit -v (verbose)