2013-12-12 109 views
16

我很好奇AWS Beanstalk部署的整個工作流程。我假設它在某個時刻運行npm以獲取安裝在服務器上的軟件包。但我只是想知道AWS Beanstalk是否使用'npm install --production'的最新命令來安裝軟件包。目前我有一個如下所示的packages.json文件,如果可能,只保證只安裝了依賴關係,而不是devDependencies。AWS Beanstalk在部署Nodejs應用程序時如何使用NPM?

"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" 
} 

回答

5

目前彈性魔豆環境中運行npm install沒有--production標誌。在導出由開發人員提供的任何env自定義(即環境選項設置)之前,這發生在/opt/elasticbeanstalk/containerfiles/ebnode.py的實例上,這意味着在EB環境的配置中設置NODE_ENV=production也不會阻止處理devDependencies。

+0

感謝您的答案。絕對好,如果這是作爲一個功能添加。我也意識到,Node.js團隊在我們所有人身上隱藏着這種東西。 ;) – Adron

+9

這不是一個正確的答案(至少今天)。影響'npm install'的方法是通過變量'NPM_CONFIG_PRODUCTION'而不是'NODE_ENV'。 Elastic Beanstalk確實支持這一點,正如我在下面的自己的答案中所指出的那樣。 – rgareth

21

如果您設置環境變量NPM_CONFIG_PRODUCTION=true,那麼您可以讓AWS Elastic Beanstalk在生產模式下運行npm install。您可以通過Elastic Beanstalk Web控制檯執行此操作。

或者,下面的文本保存到任何文件後綴.config一個在項目的根稱爲.ebextensions目錄內,您可以實現同樣的事情,而不必每次都設置它們在Web控制檯:

option_settings: 

    - option_name: NPM_CONFIG_PRODUCTION 
    value: true 

注意:確保您使用的是空格,而不是製表符,因爲它是YAML格式。

我發現更新t1.micro環境中的新node.js代碼的時間從大約5分鐘降到了90秒,現在它沒有安裝所有devDependencies,如grunt,karma,mocha,等等。

+8

在最新的Elastic Beanstalk解決方案堆棧(運行Node.js的64位Amazon Linux 2014.03 v1.0.4)中,ebnode.py腳本引用默認爲'true'的'NPM_USE_PRODUCTION'變量。在.config文件中將其設置爲'false'將導致'npm install'在沒有'--production'標誌的情況下運行。我發現沒有提及'NPM_CONFIG_PRODUCTION'變量,儘管它可能在別處用於設置'NPM_USE_PRODUCTION'。亞馬遜的任何配置文檔都沒有提到這兩個變量。 – etreworgy

+1

這會運行'postinstall'嗎? – Shamoon

+0

顯然不運行'postinstall',但它會運行'prestart'。他們如何設法使npm的使用如此困難? –

1

另一個選擇是使用npm-shrinkwrap,它具有讓您同時鎖定依賴關係的額外好處。

AWS Elastic Beanstalk suggests it here

+1

引用的文檔還指出,npm-shrinkwrap將加速部署,因爲npm install只需要執行一次。 – dhollenbeck

3

在新版本的Elastic Beanstalk Node的堆棧中,配置發生了變化,正如@ etreworgy的評論指出的那樣。

您可以查看當前的行爲,通過EC2實例中運行:

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

它返回,從今天開始:

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

所以,目前,它採用了npm install --production通過默認

對於要禁用它(因爲我是當我來到這個答案),你必須創建你的項目的根文件夾中的文件夾.ebextensionsanything.config那幾件(其中什麼意味着真的任何東西;節點,NPM,任何你想要的),與內容:

option_settings: 
    - namespace: aws:elasticbeanstalk:application:environment 
     option_name: NPM_USE_PRODUCTION 
     value: false 
相關問題