web-dev-qa-db-fra.com

Script spécifique au système d'exploitation npm package.json

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
}
21
gawi

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());
14
hurricane

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.

15
Dave P

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

1
KyleMit