2013-12-12 13 views
16

Sono curioso del flusso di lavoro complessivo di una distribuzione Beanstalk di AWS. Suppongo che esegua npm a un certo punto per ottenere i pacchetti installati sui server. Ma mi stavo chiedendo se AWS Beanstalk utilizza l'ultimo comando di 'npm install --production' per installare i pacchetti. Attualmente ho un file packages.json come mostrato di seguito e vorrei assicurare se possibile che solo le dipendenze vengano installate e non le devDependencies.In che modo AWS Beanstalk utilizza NPM durante la distribuzione di un'app Nodejs?

"dependencies": { 
    "express": "3.4.4", 
    "jade": "*", 
    "restify": "~2.6.0", 
    "assert": "~1.0.0", 
    "orchestrate": "0.0.2", 
    "chance": "~0.5.3" 
}, 
"devDependencies": { 
    "mocha": "~1.15.1" 
} 

risposta

5

Attualmente l'ambiente Elastic Beanstalk corre npm install senza il flag --production. Ciò accade sull'istanza allo /opt/elasticbeanstalk/containerfiles/ebnode.py prima che vengano esportate eventuali personalizzazioni env fornite dallo sviluppatore (vale a dire, le impostazioni delle opzioni di ambiente), il che significa che l'impostazione di NODE_ENV=production nella configurazione dell'EB Environment non impedisce l'elaborazione di devDependencies.

+0

Grazie per la risposta. Decisamente buono se questo fosse aggiunto come caratteristica. Mi rendo anche conto che la squadra di Node.js si è intrufolata in noi tutti. ;) – Adron

+9

Questa non è una risposta corretta (almeno, oggi).Il modo per influenzare 'npm install' è tramite la variabile' NPM_CONFIG_PRODUCTION' e non 'NODE_ENV'. Elastic Beanstalk lo supporta, come ho notato nella mia risposta qui sotto. – rgareth

21

È possibile ottenere AWS Elastic Beanstalk per eseguire npm install in modalità di produzione se si imposta la variabile di ambiente NPM_CONFIG_PRODUCTION=true. Puoi farlo attraverso la console web Elastic Beanstalk.

In alternativa, salvare il testo seguente per qualsiasi file con suffisso .config all'interno di una directory chiamata .ebextensions nella radice del progetto e si può ottenere la stessa cosa, senza dover impostare ogni volta nella console web:

option_settings: 

    - option_name: NPM_CONFIG_PRODUCTION 
    value: true 

Nota: assicurati di utilizzare gli spazi, non le schede, in quanto è il formato YAML.

Ho scoperto che il tempo di aggiornare il nuovo codice node.js in un ambiente t1.micro è diminuito da circa 5 minuti a 90 secondi, ora che non era l'installazione di tutte le devDependencies come grunt, karma, mocha, ecc.

+8

Nel più recente stack di soluzioni Elastic Beanstalk (64 bit Amazon Linux 2014.03 v1.0.4 in esecuzione Node.js) lo script ebnode.py fa riferimento a una variabile 'NPM_USE_PRODUCTION' che di default è 'true'. Impostando questa opzione su "false" nei file .config, verrà eseguito il comando 'npm install' senza il flag' --production'. Non ho trovato alcun riferimento a una variabile 'NPM_CONFIG_PRODUCTION', sebbene sia possibile che venga usata altrove per impostare' NPM_USE_PRODUCTION'. Nessuna delle due variabili sembra essere menzionata in nessuna documentazione di configurazione di Amazon. – etreworgy

+1

Questo eseguirà il 'postinstall'? – Shamoon

+0

Apparentemente non esegue 'postinstall', ma eseguirà' prestart'. Come sono riusciti a rendere l'utilizzo di npm così difficile? –

1

Un'opzione aggiuntiva è l'uso di npm-shrinkwrap, che ha l'ulteriore vantaggio di consentire il blocco delle dipendenze contemporaneamente.

AWS Elastic Beanstalk suggests it here.

+1

La documentazione di riferimento afferma inoltre che npm-shrinkwrap velocizzerà le distribuzioni poiché l'installazione di npm dovrà essere eseguita solo una volta. – dhollenbeck

3

Nelle nuove versioni degli stack del nodo Elastic Beanstalk, la configurazione è cambiata, come indicato dal commento di @ etreworgy.

È possibile controllare il comportamento corrente, eseguendo all'interno di un'istanza EC2:

cat /opt/elasticbeanstalk/containerfiles/ebnode.py | grep PRODUCTION 

Ritorna, a partire da oggi:

if 'NPM_USE_PRODUCTION' not in npm_env: 
    npm_env['NPM_USE_PRODUCTION'] = 'true' 
if npm_env['NPM_USE_PRODUCTION'] == 'true': 

Quindi, attualmente, utilizza il npm install --production da impostazione predefinita.

Per quelli che vogliono disabilitarlo (come mi è stato quando sono andato a questa risposta), è necessario creare un anything.config all'interno di una cartella di .ebextensions alla cartella principale del progetto (dove nulla significa veramente qualsiasi cosa; node, npm, qualunque cosa tu voglia), con il contenuto:

option_settings: 
    - namespace: aws:elasticbeanstalk:application:environment 
     option_name: NPM_USE_PRODUCTION 
     value: false 
Problemi correlati