NPM: make package.json fonctionne sous Unix (Mac OSX) et Windows

J’ai reçu un paquet NPM d’un tiers qui se développe sous Mac OSX. Leur construction peut être divisée en développement ou en production en utilisant un object “scripts” dans package.json. Par exemple:

"scripts": { "build": "NODE_ENV=dev node make.js --build", "build-prod": "NODE_ENV=prod node make.js --build", } 

Sous Unix, on peut exécuter “npm run build” ou “npm run build-prod” pour construire l’un ou l’autre des répertoires (naturellement, il existe des instructions conditionnelles dans make.js). Bien sûr, cela ne fonctionne pas sous Windows – je devais changer les commandes similaires à ceci:

  "scripts": { "build": "set NODE_ENV=dev&& node make.js --build", "build-prod": "set NODE_ENV=prod&& node make.js --build", } 

(Veuillez noter qu’il était important de ne pas mettre d’espace avant les «&&» – sinon la variable d’environnement a été créée avec un espace blanc supplémentaire qui a ruiné toutes ces comparaisons dans make.js).

Cependant, j’aimerais avoir un arbre source universel qui fonctionnerait sous Unix ou Windows sans modification. Pourriez-vous s’il vous plaît donner quelques idées sur la façon de diviser conditionnellement la version en fonction du système d’exploitation?

Je réfléchis depuis un moment, mais je doute qu’il existe une solution esthétique utilisant ces outils, pour obtenir l’effet souhaité.

Si vous êtes en mesure d’influencer le changement dans make.js , je préférerais changer ce fichier pour accepter les arguments prod ou dev , exemple: node make.js --build=dev . Avec la valeur par défaut, pour assurer la compatibilité ascendante.

En utilisant uniquement npm et ne pas modifier make.js , je ne pouvais penser à exécuter qu’un autre code JavaScript, ce qui changerait la variable d’environnement, puis appellerait make.js

Cela ressemblera à quelque chose comme:

 "build": "node middleman.js" 

Le fichier Middleman.js pourrait alors utiliser child_process ou un autre module pour définir la variable et exécuter le fichier node make.js .

Si vous ne souhaitez pas créer de fichier supplémentaire, vous pouvez ensuite intégrer tout le code JavaScript dans package.json à l’aide de:

 "build": "node -e 'my code'" 

Soyez averti que l’exécution de “node -e” process.env [\ ‘NODE_ENV \’] = \ ‘dev \’ && node make.js “ne fonctionnera pas, car process.env définit la variable dans le processus local, pas global (c.-à-d. ne pas exporter vers le système).


Ce n’est pas la solution directe, mais pour des raisons de bonnes pratiques, le faire fonctionner différemment.

La question est assez ancienne, mais pour ceux qui sont confrontés au problème de nos jours, npm à partir de la version> = 5.1.0 prend en charge la configuration du shell pour le traitement des scripts. Par défaut, sous Windows, npm utilise en interne cmd.exe pour exécuter des scripts, même si la commande npm elle-même est saisie dans git-bash. Après avoir défini git-bash comme shell, les scripts utilisant la syntaxe bash fonctionnent normalement sous Windows:

npm config set script-shell "C:\\Program Files\\Git\\bin\\bash.exe"

Ici, il faut substituer son chemin correct à l’exécutable git-bash.