Làm cách nào tôi có thể đặt NODE_ENV = sản xuất trên Windows?


340

Trong Ubuntu, nó khá đơn giản; Tôi có thể chạy ứng dụng bằng cách sử dụng:

$ NODE_ENV=production node myapp/app.js

Tuy nhiên, điều này không hoạt động trên Windows. Có một tập tin cấu hình nơi tôi có thể đặt thuộc tính?


Đối với giải pháp đa nền tảng, bạn có thể tìm thấy câu trả lời stackoverflow.com/a/57509175/11127383
Daniel Danielecki

Câu trả lời:


485

Các phiên bản hiện tại của Windows sử dụng Powershell làm vỏ mặc định, vì vậy hãy sử dụng:

$env:NODE_ENV="production"

Câu trả lời của Per @ jsalonen dưới đây. Nếu bạn đang ở trong CMD (không còn được duy trì), hãy sử dụng

set NODE_ENV=production

Điều này sẽ được thực thi trong dấu nhắc lệnh nơi bạn định chạy ứng dụng Node.js của mình.

Dòng trên sẽ đặt biến môi trường NODE_ENV cho dấu nhắc lệnh nơi bạn thực thi lệnh.

Để đặt các biến môi trường trên toàn cầu để chúng tồn tại ngoài chỉ một dấu nhắc lệnh, bạn có thể tìm công cụ từ Hệ thống trong Bảng điều khiển (hoặc bằng cách nhập 'môi trường' vào hộp tìm kiếm trong menu bắt đầu).


112
Đối với bất cứ ai vẫn đang vật lộn với điều này : set NODE_ENV=production && node app. Thuận tiện hơn cấu hình của bạn cho package.jsonphù hợp : "scripts": { "start": "set NODE_ENV=production && node app" }.
Amberlamp

5
@ShuruiLiu lệnh sẽ không xuất ra bất cứ thứ gì, nhưng bạn có thể gõ echo %NODE_ENV%để kiểm tra giá trị hiện tại của nó.
Jani Hartikainen

169
Cảnh giác: "set NODE_ENV = sản xuất &&" thêm một khoảng trắng ở cuối biến. Tôi cần "đặt NODE_ENV = sản xuất &&" để tránh không gian bổ sung phá vỡ các ứng dụng nút như Ghost.
daw

12
@Amberlamp đó không phải là một giải pháp tốt vì NODE_ENV sau đó chỉ được mã hóa cứng cho tất cả các máy; mục tiêu thực sự là thay đổi env bằng máy bằng cách sử dụng biến env hoặc truyền vào giá trị tại dòng lệnh, chứ không phải mã hóa cứng trong tệp pack.json.
Alexander Mills

6
Tôi nghĩ rằng sử dụng cross-envlà giải pháp tốt hơn cho vấn đề này nếu nhóm của bạn hoạt động trên các hệ điều hành hỗn hợp. Câu trả lời từ @MoOx sẽ là lựa chọn của tôi như một câu trả lời cho câu hỏi này.
philk

229

Tôi vừa tìm thấy một gói Node.js đẹp có thể giúp rất nhiều để xác định các biến môi trường bằng một cú pháp duy nhất, đa nền tảng.

https://www.npmjs.com/package/cross-env

Nó cho phép bạn viết một cái gì đó như thế này:

cross-env NODE_ENV=production my-command

Mà là khá thuận tiện! Không có lệnh cụ thể của Windows hoặc Unix nữa!


25
Trong khi câu trả lời đầu tiên là đúng. Tôi nghĩ rằng câu trả lời này là đáng tin cậy nhất và nên được sử dụng
d4rklit3

Đây là một giải pháp tuyệt vời!
Kirill Gusyatin

Đơn giản và hoàn hảo giải quyết vấn đề của tôi. Tôi chỉ có thể xây dựng trên Linux. Điều này đã giải quyết cả hai, Linux và Windows.
tista3

Câu trả lời này xứng đáng được yêu thương nhiều hơn, nên được chấp nhận :)
Honza Kalfus

Đây cũng là câu trả lời tốt nhất cho tôi
hỗn loạn

166

Trong PowerShell:

$env:NODE_ENV="production"

4
ps: đừng quên $ và dấu ngoặc kép;)
George

6
set NODE_ENV=productionđã không làm việc cho tôi trong powershell nhưng điều này đã làm. Cảm ơn!
cơn thịnh nộ

6
Cố gắng một chút để làm cho điều này hoạt động từ Powershell trong Visual Studio Code. Nghĩ rằng tôi sẽ để lại giải pháp ở đây. Tôi đã cố chạy lệnh "Gulp", trong khi đảm bảo giá trị env chính xác được đặt. Đây là những gì vết thương làm việc cho tôi : $env:NODE_ENV="development"; gulp runMytask. Lưu ý dấu chấm phẩy trong đó. Tệp gulp có thể sử dụng logic có điều kiện trên process.env.NODE_ENV. Trừ khi bạn đặt nó, nó sẽ không được xác định.
dvsoukup

2
Chỉ có điều này làm việc cho tôi giải pháp với các cửa sổ 10 và webpack 3.8.1
Роман Арсеньев

1
Điều này hoạt động hoàn hảo. Nhưng, cross-env NODE_ENV=productiontùy chọn thực sự là một giải pháp tốt hơn nếu chạy các lệnh npm từ pack.json yêu cầu env được đặt. Thật quá dễ dàng để rời env được đặt trên dev / prod sau khi sử dụng tùy chọn $ env: NODE_ENV
Drenai 26/12/17

105

Sẽ thật lý tưởng nếu bạn có thể đặt tham số trên cùng dòng với lệnh gọi của mình để bắt đầu Node.js trên Windows. Nhìn vào những điều sau đây một cách cẩn thận và chạy nó chính xác như đã nêu:

Bạn có hai tùy chọn sau:

  1. Tại dòng lệnh:

    set NODE_ENV=production&&npm start

    hoặc là

    set NODE_ENV=production&&node index.js
  2. Mẹo để nó hoạt động trên Windows là bạn cần xóa khoảng trắng trước và sau "&&". Định cấu hình tệp pack.json của bạn với start_windows (xem bên dưới) bên dưới. Sau đó, chạy "npm run start_windows" tại dòng lệnh.

    //package.json
    
    "scripts": {
      "start": "node index.js"
      "start_windows": "set NODE_ENV=production&&node index.js"
    }

1
DEF muốn biết làm thế nào để nó hoạt động theo cách này.
SC_Chupacabra

2
Đã làm cho tôi. Phải xóa khoảng trắng mặc dù "đặt NODE_ENV = sản xuất && gật đầu server.js"
SC_Chupacabra

2
Ước gì tôi đã đọc được điều này đến nay trước khi thử câu trả lời ở trên, sẽ giúp tôi tiết kiệm thời gian. : \
Jeff

1
Trên một ghi chú liên quan mơ hồ, tôi thấy rằng && không hoạt động như mong đợi trên các cửa sổ khi kết nối nhiều lệnh với nhau. Nếu nghi ngờ hãy thử sử dụng | thay vào đó
Mike

1
cái này hoạt động với tôi trên máy Windows 10 64 bit từ cả cmd và shell-power
Ani

30

Bạn có thể dùng

npm run env NODE_ENV=production

Đây có lẽ là cách tốt nhất để làm điều đó, bởi vì nó tương thích trên cả Windows và Unix.

Từ tài liệu kịch bản chạy npm :

Kịch bản env là một lệnh tích hợp đặc biệt có thể được sử dụng để liệt kê các biến môi trường sẽ có sẵn cho tập lệnh khi chạy. Nếu một lệnh "env" được xác định trong gói của bạn, nó sẽ được ưu tiên hơn so với tích hợp sẵn.


3
Làm thế nào chúng ta có thể thực hiện một lệnh khác với bộ biến? Điều này dường như không hoạt động: npm chạy env NODE_ENV = sản xuất && echo $ NODE_ENV. Có lẽ chúng được thực hiện trong hai vỏ khác nhau?
Jonas Kello

1
Từ những gì tôi có thể thấy, điều này hoàn toàn không hoạt động. Từ chính các tài liệu, Nó chỉ liệt kê các biến môi trường, không đặt chúng.
kumarharsh

2
Không làm việc cho tôi. Nó liệt kê các vars, hiển thị var bạn chỉ định, nhưng trong thời gian chạy, var không ổn trong process.env.YOUR_VAR ...
MoOx 10/2/2016

3
@JonasKello Bạn sẽ sử dụng cái này: npm run env NODE_ENV=production -- node -e 'console.log(process.env.NODE_ENV)'Điều --này là bắt buộc . Thay thế node -e 'console.log(process.env.NODE_ENV)'bằng bất cứ lệnh nào bạn muốn.
Pauan

Đã thử điều này với lệnh này: npm run env NODE_TLS_REJECT_UNAUTHORIZED=0 -- node --inspect ./etc/http-req-standalone.jsvà ... không có gì xảy ra. Tôi không chắc phương pháp này hoạt động trên windows.
jcollum

14

Nếu bạn đang sử dụng Visual Studio với NTVS, bạn có thể đặt các biến môi trường trên trang thuộc tính dự án:

Thuộc tính dự án Visual Studio NTVS

Như bạn có thể thấy, danh sách thả xuống Cấu hình và Nền tảng bị vô hiệu hóa (Tôi đã không nhìn quá xa vào lý do tại sao), nhưng nếu bạn chỉnh sửa .njsprojtệp của mình như sau:

  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
    <DebugSymbols>true</DebugSymbols>
    <Environment>NODE_ENV=development</Environment>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
    <DebugSymbols>true</DebugSymbols>
    <Environment>NODE_ENV=production</Environment>
  </PropertyGroup>

Việc thả xuống 'Gỡ lỗi / Phát hành' sau đó sẽ kiểm soát cách đặt biến trước khi bắt đầu Node.js.


12

Tôi đã viết một mô-đun win-node-env mà bạn có thể chạy lệnh của mình giống như bạn làm trong * nix.

NODE_ENV=production node myapp/app.js

Nó hoạt động bằng cách tạo một NODE_ENV.cmdbiến đặt NODE_ENVmôi trường và sinh ra một tiến trình con với phần còn lại của lệnh và các đối số của nó.

Chỉ cần cài đặt nó (trên toàn cầu) và chạy các lệnh script npm của bạn, nó sẽ tự động làm cho chúng hoạt động.

npm install -g win-node-env

Chính xác những gì tôi đang tìm kiếm! để chạy với các tập lệnh npm và thậm chí nó hoạt động với các công cụ cli nút khác như jest. Vì vậy, "set NODE_ENV = debug & cls & jest ..." đã trở thành "cls & NODE_ENV = debug jest"
Z. Khullah

9

Trải nghiệm của tôi khi sử dụng Node.js trên Windows 7 64-bit trong Visual Studio 2013 là bạn cần sử dụng

setx NODE_ENV development

từ một cửa sổ cmd. VÀ bạn phải khởi động lại Visual Studio để nhận ra giá trị mới.

Cú pháp thiết lập chỉ tồn tại trong khoảng thời gian của cửa sổ cmd mà nó được đặt.

Thử nghiệm đơn giản trong Node.js:

console.log('process.env.NODE_ENV = ' + process.env.NODE_ENV);

Nó trả về 'không xác định' khi sử dụng set và nó sẽ trả về 'phát triển' nếu sử dụng setx và khởi động lại Visual Studio.


cmd- không phải quyền hạn? Ugh, đến trên cửa sổ, tập hợp lại.
jcollum

nhận xét của bạn về việc khởi động lại mã VS thực sự hữu ích!
Yury Kozlov

8

Đây là phương pháp dòng lệnh:

Trong Windows 7 hoặc 10, nhập môi trường vào hộp tìm kiếm menu bắt đầu và chọn Chỉnh sửa các biến môi trường hệ thống.

Hoặc, điều hướng đến Bảng điều khiển \ Hệ thống và Bảo mật \ Hệ thống và nhấp vào Cài đặt hệ thống nâng cao

Điều này sẽ mở hộp thoại Thuộc tính hệ thống với tab Nâng cao được chọn. Ở phía dưới, bạn sẽ thấy nút Biến môi trường .... Ấn vào đây.

Hộp thoại hệ thống

Hộp thoại Biến môi trường sẽ mở.

Hộp thoại biến đổi môi trường

Ở phía dưới, bên dưới các biến hệ thống, chọn Mới ... Điều này sẽ mở hộp thoại Biến hệ thống mới.

nhập mô tả hình ảnh ở đây

Nhập tên và giá trị của biến và nhấp vào OK.

Bạn sẽ cần phải đóng tất cả các lời nhắc cmd và khởi động lại máy chủ của bạn để biến mới có sẵn cho process.env. Nếu nó vẫn không hiển thị, hãy khởi động lại máy của bạn.


2
Cảm ơn bạn! Tôi đã làm tất cả điều này nhưng nó không hoạt động cho đến khi tôi khởi động lại máy chủ.
Marcel Lamothe

7

Chỉ cần làm rõ, và cho bất cứ ai khác có thể nhổ tóc của họ ...

Nếu bạn đang sử dụng git bash trên Windows , set node_env=production&& node whatever.js dường như không hoạt động . Thay vào đó, sử dụng cmd bản địa. Sau đó, sử dụng set node_env=production&& node whatever.jscác công trình như mong đợi.

Trường hợp sử dụng của tôi:

Tôi phát triển trên Windows vì quy trình làm việc của tôi nhanh hơn rất nhiều , nhưng tôi cần đảm bảo rằng phần mềm trung gian dành riêng cho phát triển ứng dụng của tôi không bị bắn trong môi trường sản xuất.


6

Để chạy ứng dụng của bạn trong PowerShell (vì &&không được phép):

($env:NODE_ENV="production") -and (node myapp/app.js)

Lưu ý rằng đầu ra văn bản của những gì máy chủ đang làm bị chặn và tôi không chắc liệu nó có thể sửa được không. (Mở rộng câu trả lời của @ jsalonen.)


Nó không hoạt động với tôi:"debug-windows": "($env:NODE_ENV=\"dev\") -and (node src/dequeue.js)"
Evandro Pomatti

4

đầu tiên trong loại powershell

$env:NODE_ENV="production"

sau đó gõ

node fileName.js

Nó sẽ hoạt động hoàn hảo hiển thị tất cả các đầu ra.


2

Đối với nhiều biến môi trường, một .envtệp thuận tiện hơn:

# .env.example, committed to repo
DB_HOST=localhost
DB_USER=root
DB_PASS=s1mpl3
# .env, private, .gitignore it
DB_HOST=real-hostname.example.com
DB_USER=real-user-name
DB_PASS=REAL_PASSWORD

Thật dễ dàng để sử dụng với dotenv-safe:

  1. Cài đặt với npm install --save dotenv-safe.
  2. Bao gồm nó trong mã của bạn (tốt nhất khi bắt đầu index.js) và trực tiếp sử dụng nó với process.envlệnh :
require('dotenv').load()
console.log(process.env.DB_HOST)   

Đừng quên bỏ qua .envtệp trong VCS của bạn .

Chương trình của bạn sau đó thất bại nhanh nếu một biến "được xác định" trong .env.examplekhông được đặt là biến môi trường hoặc trong .env.


Các tệp .env chỉ thuận tiện cho các bí mật và thêm một bước phức tạp khi thiết lập khi gán người mới cho một dự án hoặc áp dụng các thay đổi cho chúng.
coiso

@coiso Nếu không có một vị trí chung, chung, bạn đặt nhiều biến env ở đâu? Trong tệp tập lệnh hoặc trong cài đặt phụ thuộc IDE, bạn thậm chí còn bị ràng buộc nhiều hơn với các công cụ cụ thể. Điều này làm cho việc tích hợp các thành viên nhóm mới thậm chí còn khó hơn, tôi nghĩ vậy.
Dominik

2

Trong trường hợp bạn đang sử dụng thiết bị đầu cuối GITBASH "set NODE_ENV=production" sẽ không hoạt động, bạn có thể làm gì là gõ "exportNODE_ENV=production"


0

điều này sẽ không đặt một biến nhưng nó hữu ích trong nhiều trường hợp. Tôi sẽ không khuyên bạn nên sử dụng điều này cho sản xuất, nhưng sẽ ổn thôi nếu bạn chơi xung quanh với npm.

npm install --production

0

Tôi đã sử dụng tập lệnh npm để chạy tác vụ gulp mà không có "&&"

NODE_ENV = testcase npm chạy seed-db


0

Khởi động lại mã VS nếu NODE_ENV hoặc bất kỳ biến môi trường nào khác không cung cấp giá trị chính xác. Điều này sẽ làm việc sau khi khởi động lại.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.