2015-10-06 16 views
8

Buduję aplikację elektronową, która będzie rozwijana przez ludzi zarówno w systemie Windows, jak i OS X. Chciałbym stworzyć wieloplatformowy skrypt startowy. Do tej pory miałem dokładnie zero szczęścia w uzyskaniu czegoś, co działa. Problem, jak sądzę, polega na tym, że muszę ustawić zmienną środowiskową NODE_ENV, a składnia jest nieco inna.Skrypt startowy NPM na platformę krzyżową

Mam nadzieję, że istnieje sposób, którego jeszcze nie znalazłem. Moja aktualna sekcja skryptów:

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

Naprawdę chciałbym stworzyć pojedynczy skrypt "startowy" i wyeliminować warianty specyficzne dla platformy. Czy to możliwe?

Odpowiedz

8

Zmienne środowiskowe są problemem w systemie Windows.

Jak stwierdzono Domenic Denicola (jeden z głównych czynników przyczyniających się do KMP)

To nie jest praca w KMP. Możesz uruchomić niestandardowe skrypty węzła, aby ustawić zmienne środowiskowe za pomocą procesu process.env, jeśli chcesz, lub użyć czegoś, co nie jest zmiennymi środowiskowymi (takimi jak JSON).

...

Można pisać własne skrypty w celu obejścia ograniczeń Connect, na przykład w twoich testach modyfikuj process.env.

(Reference: this issue)

więc uda nam przez skrypt JS (roztwór inspirowane na tej commit):

  1. Utwórz plik exec.js w katalogu scripts

  2. Skopiuj następujący kod w 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. zaktualizować swój package.json:
"scripts": { 
    "start": "node scripts/exec.js development", 
} 
  1. Uruchom skrypt npm: npm run start

Edycja 05.04.2016

Istnieje bardzo przydatny pakiet npm, który pozwala zarządzać ten problem: cross-env. Uruchamiaj polecenia ustawiające zmienne środowiskowe na różnych platformach

+0

Dziękujemy za wyczerpującą odpowiedź. Nie będę miał szansy na przetestowanie go przez dzień lub dłużej, ale w międzyczasie przebudowuję, ponieważ wygląda to na świetne rozwiązanie problemu. Oznaczę to jako odpowiedź, gdy wiem, że wszystko poszło dobrze. Dzięki jeszcze raz! –

Powiązane problemy