name: inverse layout: true class: middle inverse --- # `npm.scripts` ## Simple task running ##
@mollerse
--- # En del av npm's Package.json format Defineres i `Package.json`: ```json { ... scripts: { "test": "node test.js" } ... } ``` Eksekveres med: ```bash npm run test ``` --- class: middle # Task runners vs byggescripts En task runner eksekverer byggescripts --- # Hvilket problem løser en task runner? Et JS-prosjekt har mange oppgaver knyttet til seg. Mange problemer fører til mange verktøy, mange verktøy fører til mye kompleksitet. Kompleksitet vi bare vil forholde oss til når vi definerer tasken, ikke hver gang vi skal utføre den. --- .left-column[ # Hvorfor? ] --- .left-column[ # Hvorfor? ] .right-column[ ## Ett sted å definere alle tasks for prosjektet Samler alle tasks under en felles interface for dokumentasjon og gjenfinning ] --- .left-column[ # Hvorfor? ] .right-column[ ## Ett sted å definere alle tasks for prosjektet Samler alle tasks under en felles interface for dokumentasjon og gjenfinning ## En uniform interface for å kjøre alle tasks Alle tasks kan kjøres ved å bruke den samme CLIen ] --- .left-column[ # Hvorfor? ] .right-column[ ## Ett sted å definere alle tasks for prosjektet Samler alle tasks under en felles interface for dokumentasjon og gjenfinning ## En uniform interface for å kjøre alle tasks Alle tasks kan kjøres ved å bruke den samme CLIen ## Abstraherer bort konfigurasjon En task kan endre implementasjon eller byttes helt ut uten at interfacen til brukeren av task runnern trenger å tenke på det. ] --- .left-column[ # Hvorfor `npm`? ] --- .left-column[ # Hvorfor `npm`? ] .right-column[ ## `npm` er allerede en dependency Du trenger ikke installere _enda et verktøy_, du har allerede `npm` i verktøykassa. ] --- .left-column[ # Hvorfor `npm`? ] .right-column[ ## `npm` er allerede en dependency Du trenger ikke installere _enda et verktøy_, du har allerede `npm` i verktøykassa. ## Utvider `$PATH` `$PATH` blir utvidet med alle kommandoer fra `/node_modules/.bin`, noe som frigjør deg fra globale installs ] --- .left-column[ # Hvorfor `npm`? ] .right-column[ ## `npm` er allerede en dependency Du trenger ikke installere _enda et verktøy_, du har allerede `npm` i verktøykassa. ## Utvider `$PATH` `$PATH` blir utvidet med alle kommandoer fra `/node_modules/.bin`, noe som frigjør deg fra globale installs ## Hook inn i `npm` lifecycle scripts `npm.scripts` gir deg muligeten til å gjøre ekstra-arbeid ifm andre lifecycle scripts som `npm` kjører. ] --- # Utvidelse av `$PATH` ```json { "scripts": { "build": "gulp build" } } ``` Her refererer `gulp` til din lokale `gulp`-dependency som ligger i `./node_modules/` Dette sparer deg for `npm i -g gulp` og å skrive full path til bin'en i scripts-definisjonen (`./node_modules/.bin/gulp`) --- # Lifecycle hooks ```json { "scripts": { "preinstall": "echo \"installing packages\"", "postinstall": "bower install" } } ``` Bruken av `pre`- og `post`-prefixes gir deg muligheten til å kjøre tasks før og etter npm's lifecycle scripts. Disse lifecycle scriptene (`install`, `publish`, `uninstall`, `version`, `test`, `start`, `restart`, `stop`) tilsvarer vanlige npm-kommandoer. --- # Brukerdefinerte tasks ```json { "scripts": { "prebuild": "jshint *.js", "postbuild": "npm run test" } } ``` `pre`- og `post`-prefixes fungerer også for brukerdefinerte tasks. Dette gir oss muligheten til å gjøre en viss grad av orkestrering med kun `npm.scripts`. --- # Komplekse kommandoer og ekstra args ```json { "scripts": { "build": "browserify app.js -t babelify brfs envify -o bundle.js", "build-debug": "npm run build -- -d" } } ``` `npm.scripts` gir deg en mulighet til å gi et mer semantisk korrekt navn til en potensielt kompleks kommando. Dette frigjør deg fra implementasjon.red[*]. Du kan også passe ekstra argumenter til en task når du kjører den ved å bruke `[--
]`. .footnote[.red[*] Dette skal vi se på etterpå] --- # Tasks trenger ikke være node eller JavaScript! ```json { "scripts": { "generate-fixtures": "fsi project.domain/GenerateFixtures.fsx", "serve": "iisexpress --path:. --port:2440" } } ``` **NB**: Tenk på kryssplatform. Unngå shell-kommandoer og utils hvis du har behov for kryssplattformstøtte. Husk også at paths tolkes anderledes på Windows og *nix. --- # Fin.