Come distribuire l’app nodo che usa grunt su heroku

Sto usando grunt e anche plugin come grunt-contrib-copy , grunt-contrib-mincss (che sono elencati come dipendenze di npm per la mia applicazione).

Inoltre non impegno la cartella npm_modules e public cartella public , dove sono tutti i file generati. E non riesco a capire come build la mia app (ho il comando grunt build ) dopo aver distribuito e configurato il mio server (è già in cerca di public cartella public ).

Ho visto alcune cose come grunt-heroku-deploy , ma mi sembra una ctriggers idea commettere prima del caricamento. Forse ci sono delle decisioni delicate … Qualche idea?

npm ha un supporto per un passaggio postinstall (tra molti altri) che potrebbe essere proprio quello che stai cercando.

Il file node.js heroku buildpack esegue questo comando quando si passa a heroku per risolvere le dipendenze di compilazione:

 $ npm install --production 

https://devcenter.heroku.com/articles/nodejs-support#build-behavior

Se dai un’occhiata alla documentazione di npm, puoi configurare una serie di script da eseguire prima o dopo che chiunque npm install per il tuo pacchetto. È configurato nella proprietà scripts di package.json . La proprietà scripts consente di eseguire script personalizzati (incluso grunt ) quando accadono certe cose nel ciclo di vita di un pacchetto.

Ad esempio, per echo del testo ed eseguire il comando grunt ogni volta che chiunque (incluso Heroku) esegue npm install , aggiungilo al tuo package.json :

 { ... "scripts": { "postinstall": "echo postinstall time; ./node_modules/grunt-cli/bin/grunt " }, ... } 

https://npmjs.org/doc/scripts.html

Avvertenze importanti:

  • Potrebbe essere necessario modificare il percorso del binario grunt nello script postinstall , controllare l’output dell’errore se il comando grunt non viene eseguito.
  • grunt e grunt-cli devono essere elencati come una dependency nel package.json modo che venga installato da Heroku. La loro lista sotto devDependencies non è sufficiente poiché Heroku non li installerà. Inoltre, si noti che Heroku non lo installerà come pacchetto globale, quindi per eseguirlo su Heroku si dovrà usare un percorso relativo (come configurato sopra).

Se questo non funziona (probabilmente dovrai smanettare un po ‘con i percorsi relativi), allora potresti prendere in considerazione la possibilità di scrivere il tuo buildpack personalizzato per Heroku .

Aggiornare

A partire da 0.4, il pacchetto grunt non contiene più il binario grunt , che ora fa parte del pacchetto grunt-cli . La risposta è stata aggiornata per riflettere questo.

Sembra che verrà risolto in gran parte quando le slug API Heroku Platorm e le funzionalità di release lo renderanno nella linea principale. A quel punto, è ansible creare il codice localmente (o su un server ci), comprimerlo e inviarlo a heroku tramite una chiamata API e rilasciarlo da lì.

Questo è ancora nel periodo beta ed è stato annunciato solo il 19 dicembre 2013.

https://devcenter.heroku.com/articles/platform-api-deploying-slugs

Non sono mai stato molto contento di quante persone sembrassero ok nel controllare il codice generato in git o nel hook postinstall di NPM. 🙁

Inoltre, da una posizione filosofica, fare una build durante un rilascio è semplicemente un altro potenziale punto di fallimento.


Solo per divertimento : dal momento che non è ancora finalizzato, ecco uno script di bash che ho buttato insieme, che puoi utilizzare per il momento per creare il tuo codice su un ramo di distribuzione, impegnarlo, distribuirlo su heroku e quindi rimuovere il ramo di distribuzione. (In realtà non sono un fan degli script di distribuzione di bash, quindi non vedo l’ora che vengano aggiunte le API della piattaforma)

 #!/bin/bash set -e # Delete current deploy branch git branch -D deploy # Create new deploy branch based on master git checkout -b deploy # Grunt comands to build our site grunt build:production # the dist/ directory is in my .gitignore, so forcibly add it git add -f dist/ git commit -m "Deploying to Heroku" # Push it up to heroku, the -f ensures that heroku won't complain git push heroku -f deploy:master # Switch it back to master git checkout master 

Grunt (et al.) È uno strumento di compilazione, non (davvero) qualcosa che dovresti preparare e mettere in produzione. Un approccio diverso sarebbe quello di utilizzare Grunt per preparare il progetto localmente (o meglio su un server CI) prima di solo spingere i file costruiti su Heroku. Come già accennato, Heroku eseguirà un’installazione di npm install sulla tua app dopo il suo push, che dovrebbe essere sufficiente da sola per preparare finalmente la tua app.

L’ho installato in modo che l’app Heroku derivata / costruita da Grunt vivesse in un repository Git completamente separato per il repo del codice sorgente dell’app principale. In questo modo, quando grunt deploy si ottimizza e copia i file rilevanti sul repository Heroku, lo riordina ( git add -A ecc.) E quindi git push heroku master (o qualsiasi altra cosa).

Sembra una separazione più chiara delle preoccupazioni se i tuoi server live sono responsabili solo dell’esecuzione di un pacchetto di app pre-costruito.

YMMV naturalmente, e la risposta sopra accettata è totalmente valida anche … specialmente su un ambiente live ben compreso e stabile come Heroku.

Il buildpack di Heroku funziona bene per me. Grandi cose.

Per farlo funzionare con Grunt 4.0 ho seguito le istruzioni qui https://discussion.heroku.com/t/grunt-on-heroku/98/2 . L’unico cambiamento che ho dovuto fare è stato rimuovere il path to grunt dato che usare le barre di stile di Unix lo farebbe fallire in Windows e viceversa. Fortunatamente non è nemmeno necessario specificare il percorso poiché NPM cercherà il grunt nella cartella node_modules / .bin https://npmjs.org/doc/scripts.html#path .

  1. assicurati di avere sia grunt che grunt-cli installati localmente nel tuo pacchetto.json anche se grunt ti dice di installare il cli a livello globale: $: npm i -S grunt grunt-cli

  2. aggiungi un passaggio postinstall al tuo pacchetto.json che assomiglia a questo: "postinstall": "grunt prod"

Guarda questo tutorial: https://medium.com/p/c227cb1ddc56 . Spiega come è ansible distribuire un’app per grunt su Heroku con un buildpack personalizzato.

Il passaggio post-installazione di npm è probabilmente la scelta migliore, dal momento che puoi invocare grunt da lì. Ma dovresti anche controllare un buildpack personalizzato, come heroku-buildpack-nodejs-grunt .

Questo post è specifico per Rails ma non vedo perché non potresti usarlo con qualsiasi framework di back-end e basta scambiare il buildpack di Ruby con qualsiasi cosa tu stia usando.

La soluzione è fondamentalmente usare multi buildpack e fare in modo che il buildpack Node / Grunt esegua il grunt build per te direttamente su Heroku.

Significativamente, questa soluzione non ti consente di controllare gli artefatti di build nel controllo di versione. (Sìì!!!)

http://www.angularonrails.com/deploy-angular-rails-single-page-application-heroku/