2015-09-11 22 views
5

Tôi đang cố gắng đặt biến môi trường toàn cục ra khỏi ứng dụng node.js của mình.Đặt biến môi trường toàn cục ra khỏi Node.js

Mục tiêu là:

  1. Khi khởi động lại APP, biến môi trường vẫn cần được thiết lập
  2. Khi mở một shell mới, nó nên được sử dụng
  3. Nếu có thể: Khi khởi động lại, giống như 1.
  4. Nó sẽ làm việc trên Linux, Mac OS X (và cần một lệnh SET thay thế cho các cửa sổ)

đây là những gì Tôi đã làm:

var setEnv = require('child_process') 
     .spawn('export GLOBALVARNAME='+my.value,{ 
      stdio: 'inherit', 
      env: process.env 
     }); 

Nhưng điều này gây ra trong

{ [Error: spawn export GLOBALVARNAME=foobar ENOENT] 
    code: 'ENOENT', 
    errno: 'ENOENT', 
    syscall: 'spawn export GLOBALVARNAME=foobar', 
    path: 'export GLOBALVARNAME=foobar', 
    spawnargs: [] } 

tôi đã không kiểm tra này trên Windows, nhưng trên Mac OS X (và Linux) lệnh ngay trên bash là export GLOBALVARNAME=value. Đối với Windows, lệnh phải là SET GLOBALVARNAME=value - phải không?

Vì vậy, câu hỏi chính là: Có vấn đề gì với hướng dẫn sử dụng export GLOBALVARNAME=foobar?

+0

để hiểu tại sao nó được đem lại cho bạn 'ENOENT' xem http: // stackoverflow.com/questions/19902828/why-does-enoent-mean-no-such-file-or-directory – chicks

Trả lời

3

export không phải là lệnh độc lập mà là trình tạo nội dung vỏ đặt biến môi trường cho quy trình trình vỏ hiện tại và con của nó được chia nhỏ sau khi được đặt.

Bạn không thể đặt biến môi trường cho các quá trình không phải là hậu duệ của quy trình hiện tại. Và dưới Linux, không có thứ gì như biến môi trường hệ thống.

Trong Linux, biến của bạn phải được đặt trong tập lệnh init sẽ sinh ra ứng dụng của bạn hoặc trong đơn vị hệ thống. Nếu bạn muốn nó có sẵn trong vỏ người dùng tương tác, nó phải được đặt trong /etc/profile hoặc /etc/profile.d

.

+0

Tôi nghĩ rằng đó là một lệnh độc lập ... đó là xấu. Vì vậy, tôi cần phải mở một tập tin và viết vào nó. Damn ... –

+0

http://stackoverflow.com/questions/4870328/how-to-read-environment-variable-in-node-js cho thấy cách truy cập vào môi trường của bạn mà không bị bắn phá. Nó hoạt động để viết quá. – chicks

2

này cung cấp cho một thử:

https://www.npmjs.com/package/shelljs

Tôi không nghĩ rằng nó có thể cho một quá trình con để thay đổi môi trường quá trình của cha mẹ. Vì vậy, tôi không thực sự nghĩ rằng nó có thể sử dụng child_process.

Mẫu mã:

var shell = require('shelljs'); 
shell.exec('export ENV_VARIABLE=ABRACADABRA'); 
+0

bạn nói đúng, nó không hoạt động khi sử dụng child_process. Ý tưởng xuất khẩu làm cho mọi thứ toàn cầu với hiệu ứng nó không liên quan đến vỏ bọc mẹ là gì ... –

+0

Nó cũng không hoạt động trong các cửa sổ. Mục tiêu chính của shelljs là mutiplatform – sam

3

Như câu trả lời khác đã chỉ ra, bắn phá ra và thay đổi một biến môi trường cơ bản là một NO-OP. Hoặc bạn muốn thay đổi môi trường cho quy trình hiện tại của bạn và con cái của nó hoặc bạn muốn thay đổi nó cho các quy trình mới. Chỉnh sửa /etc/profile sẽ thực hiện thay đổi cho bất kỳ quy trình mới nào như @Hmlth nói.

Nếu bạn muốn thay đổi môi trường cho quá trình hiện tại của bạn này là thẳng về phía trước:

process.env.YOUR_VAR = 'your_value'; 
Các vấn đề liên quan