2016-05-10 29 views
19

Tôi có một package.json với sau (giản thể) nội dung trong kịch bản chính:biến môi trường Passing trong NPM-scripts

... 
scripts: { 
    "start": "NODE_ENV=${NODE_ENV:=production} node start-app.js", 
    "poststart": "echo $NODE_ENV" 
} 
... 

Từ dòng lệnh tôi có thể chạy:

npm start 

này sẽ chạy tập lệnh start-app.js của tôi và đặt biến môi trường process.env.NODE_ENV thành "production". Xem here để được giải thích cú pháp.

Poststart sẽ tự động chạy sau khi bắt đầu như được mô tả here.

Tuy nhiên poststart sẽ không "kế thừa" biến môi trường shell NODE_ENV, vì vậy lệnh echo sẽ không echo bất cứ điều gì.

Mã sản phẩm của tôi phức tạp hơn một chút, nhưng những gì tôi đang cố gắng hoàn thành là chuyển biến NODE_ENV từ "điểm bắt đầu" sang tập lệnh phụ thuộc. Bất kỳ đề xuất/thực tiễn tốt nhất về cách làm điều đó?

Tôi không muốn hardcode NODE_ENV trong poststart, bởi vì tôi có thể muốn làm:

NODE_ENV=development npm start 

và tôi muốn everyting "xuống chuỗi" thừa hưởng cùng một môi trường.

+0

Từ [những gì tôi nhìn thấy] (https://docs.npmjs.com/misc/scripts), lĩnh vực _he package.json là tacked vào npm_package_ prefix_, vì vậy bạn có thể muốn nói 'npm_package_node_env'. – fedorqui

+0

Khi chạy nhiều lệnh, bạn nên 'xuất' biến. 'export NODE_ENV = something' – Michael

Trả lời

13

Bạn có một vài lựa chọn:

  • better-npm-run, có thể xác định một env cho mỗi lệnh riêng
  • Thay vì một kịch bản poststart, bạn có thể nối các lệnh cho NPM như vậy: "start": "NODE_ENV=${NODE_ENV:=production} node start-app.js && echo $NODE_ENV"
  • Sử dụng một người quản lý quy trình trong sản xuất như pm2. pm2 cho phép bạn xác định các tệp json môi trường cụ thể với các cài đặt như NODE_ENV. Tại công ty của chúng tôi, chúng tôi chạy thành công tất cả các ứng dụng của chúng tôi trong các môi trường khác nhau với pm2 (tất cả đều có cùng lệnh bắt đầu)
+0

NODE_ENV vẫn có thể sử dụng được khi bạn echo? Tôi kinh nghiệm rằng nó đi, ref https://www.npmjs.com/package/cross-env#known-limitations – vonGohren

+0

đúng, với 'cross-env' điều này là không thể. Ví dụ thứ hai thực sự gán một biến môi trường (không sử dụng cross-env). –

+0

@MarioTacke Tôi vừa đưa ra một thử nghiệm và nó ** không gán ** một biến. Nếu nó được đặt trước lệnh 'npm start', nó hoạt động (bên trong lệnh' start' script). – kaiser

0

Nếu bạn sử dụng gói nhỏ, hãy sử dụng tốt hơn-npm-run. Đối với trường hợp nhỏ, nó hoạt động tốt. Bằng cách nào đó nếu bạn có rất nhiều lệnh và khó quản lý. Hãy thử, batman-cli. Làm việc tốt và xử lý rất nhiều vấn đề môi trường phụ thuộc vào

NPM i -G batman-cli

Các vấn đề liên quan