2015-10-06 23 views
8

Tôi đang xây dựng một ứng dụng Điện tử sẽ được phát triển bởi mọi người trên cả Windows và OS X. Tôi muốn tạo một tập lệnh bắt đầu đa nền tảng. Cho đến nay, tôi đã có chính xác không may mắn nhận được một cái gì đó hoạt động. Vấn đề, tôi nghĩ, là tôi cần phải đặt biến môi trường NODE_ENV và cú pháp hơi khác.Nền tảng chéo NPM bắt đầu tập lệnh

Tôi hy vọng có một cách mà tôi chưa tìm thấy. Phần tập lệnh hiện tại của tôi theo sau:

"scripts": { 
    "start:osx": "NODE_ENV=development electron ./app/", 
    "start:win": "set NODE_ENV=development && electron ./app/" 
} 

Tôi thực sự muốn tạo một tập lệnh "bắt đầu" và loại bỏ các biến thể nền tảng cụ thể. Có thể không?

Trả lời

8

Biến môi trường là một vấn đề trong Windows.

Như đã nêu Domenic Denicola (một trong những người đóng góp chính để NPM):

Đây không phải là công việc của NPM của. Bạn có thể chạy các kịch bản lệnh Node tùy chỉnh để thiết lập các biến môi trường bằng cách sử dụng process.env nếu bạn muốn, hoặc sử dụng một cái gì đó không phải là các biến môi trường (như JSON).

...

Bạn có thể viết tập lệnh tùy chỉnh để giải quyết các giới hạn của kết nối, ví dụ: trong các bài kiểm tra của bạn sửa đổi process.env.

(Tham khảo: this issue)

Vì vậy, chúng tôi sẽ quản lý thông qua một kịch bản JS (Giải pháp truyền cảm hứng trên commit này):

  1. Tạo một file exec.js trong một thư mục scripts

  2. Sao chép mã sau đây vào exec.js:

var exec = require('child_process').exec; 

var command_line = 'electron ./app/'; 
var environ = (!process.argv[2].indexOf('development')) ? 'development' : 'production'; 

if(process.platform === 'win32') { 
    // tricks : https://github.com/remy/nodemon/issues/184#issuecomment-87378478 (Just don't add the space after the NODE_ENV variable, just straight to &&:)  
    command_line = 'set NODE_ENV=' + environ + '&& ' + command_line; 
} else { 
    command_line = 'NODE_ENV=' + environ + ' ' + command_line; 
} 

var command = exec(command_line); 

command.stdout.on('data', function(data) { 
    process.stdout.write(data); 
}); 
command.stderr.on('data', function(data) { 
    process.stderr.write(data); 
}); 
command.on('error', function(err) { 
    process.stderr.write(err); 
}); 
  1. Cập nhật của bạn package.json:
"scripts": { 
    "start": "node scripts/exec.js development", 
} 
  1. Run NPM kịch bản: npm run start

Chỉnh sửa 05.04.2016

Có gói npm rất hữu ích cho phép quản lý vấn đề này: cross-env. Chạy các lệnh đặt biến môi trường trên các nền tảng

+0

Cảm ơn câu trả lời toàn diện. Tôi sẽ không có cơ hội để thử nghiệm nó trong một ngày hoặc lâu hơn, nhưng upvoting trong tạm thời bởi vì nó trông giống như một giải pháp tuyệt vời cho vấn đề. Sẽ đánh dấu nó như là câu trả lời một khi tôi biết tất cả diễn ra tốt đẹp. Cảm ơn một lần nữa! –

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