2013-12-12 21 views
16

Tôi tò mò về quy trình làm việc chung của triển khai AWS Beanstalk. Tôi giả sử nó chạy npm tại một số điểm để có được các gói được cài đặt trên máy chủ (s). Nhưng tôi đã tự hỏi nếu AWS Beanstalk sử dụng lệnh mới nhất của 'npm install --production' để cài đặt các gói. Hiện tại tôi có một tệp packages.json như được hiển thị bên dưới và muốn đảm bảo nếu có thể chỉ có các phụ thuộc đang được cài đặt chứ không phải các phần phụ thuộc.AWS Beanstalk sử dụng NPM khi triển khai ứng dụng Nodejs như thế nào?

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

Trả lời

5

Hiện tại môi trường cây đậu đàn hồi chạy npm install mà không có cờ --production. Điều này xảy ra trên phiên bản /opt/elasticbeanstalk/containerfiles/ebnode.py trước khi có bất kỳ tùy chỉnh env nào do nhà phát triển cung cấp (nghĩa là cài đặt tùy chọn môi trường), có nghĩa là thiết lập NODE_ENV=production trong cấu hình của Môi trường EB cũng không ngăn không cho xử lý phụ thuộc vào devDependencies.

+0

Cảm ơn câu trả lời. Chắc chắn tốt nếu điều này đã được thêm vào như là một tính năng. Tôi cũng nhận ra rằng nhóm Node.js đã lẻn vào đó trong tất cả chúng ta. ;) – Adron

+9

Đây không phải là câu trả lời đúng (ít nhất, hôm nay).Cách ảnh hưởng đến 'npm install' là thông qua biến' NPM_CONFIG_PRODUCTION' và không phải 'NODE_ENV'. Cây đậu đàn hồi hỗ trợ điều này, như tôi đã lưu ý trong câu trả lời của riêng tôi dưới đây. – rgareth

21

Bạn có thể lấy AWS Elastic Beanstalk để chạy npm install trong chế độ sản xuất nếu bạn đặt biến môi trường NPM_CONFIG_PRODUCTION=true. Bạn có thể làm điều này thông qua giao diện điều khiển web cây đàn hồi.

Ngoài ra, lưu văn bản sau đây đối với bất kỳ tập tin với hậu tố .config bên trong một thư mục gọi là .ebextensions trong thư mục gốc của dự án và bạn có thể đạt được điều tương mà không cần phải cài đặt chúng mỗi khi trong web console:

option_settings: 

    - option_name: NPM_CONFIG_PRODUCTION 
    value: true 

Lưu ý: đảm bảo bạn đang sử dụng dấu cách, không phải tab, vì đó là định dạng YAML.

Tôi nhận thấy rằng thời gian cập nhật mã node.js mới trong môi trường t1.micro giảm từ khoảng 5 phút xuống 90 giây, bây giờ nó không cài đặt tất cả các devDependencies như grunt, karma, mocha, v.v.

+8

Trong ngăn xếp giải pháp Elastic Beanstalk mới nhất (64bit Amazon Linux 2014.03 v1.0.4 đang chạy Node.js), tập lệnh ebnode.py tham chiếu biến 'NPM_USE_PRODUCTION' mặc định là 'true'. Đặt giá trị này thành 'false' trong các tệp .config của bạn sẽ dẫn đến 'npm install' được chạy mà không có cờ' --production'. Tôi không tìm thấy tham chiếu đến biến 'NPM_CONFIG_PRODUCTION', mặc dù nó có thể được sử dụng ở nơi khác để đặt' NPM_USE_PRODUCTION'. Không biến nào dường như được đề cập trong bất kỳ tài liệu cấu hình nào của Amazon. – etreworgy

+1

Thao tác này có chạy 'postinstall' không? – Shamoon

+0

Rõ ràng không chạy 'postinstall', nhưng nó sẽ chạy' prestart'. Làm thế nào họ đã quản lý để làm cho việc sử dụng npm khó khăn như vậy? –

1

Tùy chọn bổ sung là sử dụng npm-shrinkwrap, có lợi ích bổ sung cho phép bạn khóa các phụ thuộc cùng một lúc.

Cây đậu nành AWS suggests it here.

+1

Tài liệu tham chiếu cũng cho biết rằng npm-shrinkwrap sẽ tăng tốc độ triển khai khi cài đặt npm sẽ chỉ cần thực hiện một lần. – dhollenbeck

3

Trong phiên bản mới của ngăn xếp Đàn hồi Beanstalk Node, cấu hình đã thay đổi, như được chỉ ra bởi nhận xét của @ etreworgy.

Bạn có thể kiểm tra các hành vi hiện tại, bằng cách chạy bên trong một thể EC2:

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

Nó trả, tính đến ngày hôm nay:

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

Vì vậy, hiện nay, nó sử dụng npm install --production bởi mặc định.

Đối với những người mà muốn vô hiệu hóa nó (như tôi là khi tôi đi đến câu trả lời này), bạn phải tạo một anything.config bên trong một thư mục .ebextensions tại thư mục gốc của dự án của bạn (nơi bất cứ điều gì nghĩa thực sự bất cứ điều gì; nút, npm, bất cứ điều gì bạn muốn), với nội dung:

option_settings: 
    - namespace: aws:elasticbeanstalk:application:environment 
     option_name: NPM_USE_PRODUCTION 
     value: false 
Các vấn đề liên quan