Je voudrais créer un package.json
script de construction qui exécute un ensemble de commandes légèrement différent lorsqu'il est exécuté à partir de Windows, Linux, Mac.
Le problème est que je ne trouve pas de moyen de le mettre dans package.json
fichier qui fonctionnera sans problème sur tous les systèmes.
Voici un exemple que j'aimerais avoir:
"scripts" : {
"build.windows" : "echo do windows specific stuff",
"build.linux" : "echo do linux specific stuff",
"build.mac" : "echo do mac specific stuff",
"build" : "??????????????" <- what to put here to execute script designed for OS
on which npm is running
}
Vous pouvez utiliser des scripts avec la commande node run-script. npm run
en est un raccourci.
Paquet json:
"scripts" : {
"build-windows" : "node build-windows.js",
"build-linux" : "node build-linux.js",
"build-mac" : "node build-mac.js",
"build" : "node build.js"
}
Ligne de commande:
npm run build-windows
Si vous ne l'aimez pas, vous pouvez utiliser des commandes dans node.js.
Paquet json:
"scripts" : {
"build" : "node build.js"
}
Build.js
var sys = require('sys')
var exec = require('child_process').exec;
function puts(error, stdout, stderr) { sys.puts(stdout) }
var os = require('os');
//control OS
//then run command depengin on the OS
if (os.type() === 'Linux')
exec("node build-linux.js", puts);
else if (os.type() === 'Darwin')
exec("node build-mac.js", puts);
else if (os.type() === 'Windows_NT')
exec("node build-windows.js", puts);
else
throw new Error("Unsupported OS found: " + os.type());
Il existe un package NPM appelé run-script-os
( NPM | GitHub ) qui ne vous oblige pas à écrire de fichiers supplémentaires, et cela peut être pratique si que vous essayez de faire est très simple. Par exemple, dans votre package.json
, vous pourriez avoir quelque chose comme:
"scripts": {
"test": "run-script-os",
"test:darwin:linux": "export NODE_ENV=test && mocha",
"test:win32": "SET NODE_ENV=test&& mocha"
}
Ensuite, vous pouvez exécuter npm test
sur Windows, Mac ou Linux et obtenez des résultats similaires (ou différents!) sur chacun.
Cela dépend exactement de ce que vous essayez de faire dans les scripts, mais vous pouvez probablement utiliser les packages npm cli pour ajouter efficacement des commandes multiplateformes à n'importe quel Shell.
Par exemple, si vous vouliez supprimer un répertoire, vous pourriez utiliser des syntaxes distinctes pour Windows et Linux:
rm -rf _site # bash
rd /s /q _site # cmd
Ou bien, vous pouvez utiliser le package npm rimraf
qui fonctionne sur plusieurs plateformes:
npx rimraf _site
Pour prendre l'exemple de Dave P ci-dessus, vous pouvez définir des variables d'environnement avec cross-env
comme ceci:
"scripts": {
"test": "npx cross-env NODE_ENV=test mocha",
}
Et si vous ne voulez pas utiliser npx
pour installer des scripts en direct, vous pouvez les installer globalement à l'avance comme ceci:
npm i cross-env -g
Voici un article sur lequel j'ai écrit faire fonctionner les scripts NPM sur toutes les plateformes qui explore certaines de ces options