web-dev-qa-db-fra.com

Configurez le nœud npm package.json pour que le "test npm" fonctionne à la fois sur unix et sur windows

J'ai développé un module npm node.js, développé sous Windows. Aujourd'hui, j'ai écrit des tests Mocha. Après de nombreuses luttes, il semblait que pour npm test travailler, package.json devait ressembler à ceci: (il peut y avoir d'autres options ???)

"scripts": { "test": "node node_modules/mocha/bin/mocha" }

au lieu de ce qui est dans tous les livres basés sur Unix,

"scripts": { "test": "./node_modules/.bin/mocha" }

Comment puis-je configurer package.json pour fonctionner à la fois sur Windows et Unix? Je suppose que Travis-CI exécute Unix, donc, si je lie la version à celle-ci, elle explosera avec la version Windows.

J'ai trouvé un fil de deux ans où quelqu'un a demandé une fonctionnalité pour exactement cela. Ce fil semblait s'éteindre. Cette SO question semble être proche, mais ce n'est pas exactement ce que je veux et, franchement, je ne peux pas comprendre la réponse. :-( Quelqu'un peut-il clarifier?

Pour le moment, je vais

"scripts": {
      "test": "node node_modules/mocha/bin/mocha",
      "testOnUnixUseThis"    : "./node_modules/.bin/mocha (I think)",
      "testOnWindowsUseThis" : "node node_modules/mocha/bin/mocha"
  },

Malheureusement, vous ne pouvez pas aller npm test testOnWindowsUseThis ou npm testOnWindowsUseThis. Et cela ne résout pas le problème de Travis-CI. Mais au moins une personne qui télécharge le module peut (espérons-le) voir ce qui se passe.

De meilleures idées? Suis-je la seule personne à développer sous Windows ??? :-)

28
user949300

J'ai toujours pu npm install -g mocha ou npm install mocha puis ajoutez

"scripts": {
    "test": "mocha spec"
}

à package.json. Cela peut ou non fonctionner dans CHAQUE environnement. Je sais, par exemple, avec le joueur de ligne, vous devez utiliser bin/mocha. De plus, si vous ne trouvez pas un moyen de contourner cela, configurez votre script de test pour Unix, puis ajoutez un deuxième script appelé "wintest" ou quelque chose qui fait tout ce que vous avez besoin de faire dans Windows. Vous pouvez nommer vos scripts comme vous le souhaitez. Ceux par défaut (test, démarrage, etc.) peuvent être utilisés avec npm [command]; tous ceux non standard (comme wintest) peuvent être utilisés avec npm run-script [command], et ils fonctionneront toujours.

Une petite histoire sur comment/pourquoi cela fonctionne:

Lorsque vous installez un module globalement, il est disponible sur PATH (ou quel que soit l'équivalent de Windows). Lorsque vous installez une dépendance de projet, si ce module possède des fichiers binaires, ceux-ci sont liés par un lien symbolique vers node_modules/.bin et lorsque vous exécutez npm run [some-command], npm ajoute utilement node_modules/.bin vers PATH pour cette commande. Ainsi, lorsque mocha est installé globalement "test": "mocha spec" utilise votre mocha installé globalement pour exécuter des tests. Lorsqu'il s'agit d'une dépendance de projet, elle utilise celle de node_modules/.bin. Le seul problème que j'ai trouvé avec cela est que npm ajoute node_modules/.bin au front de PATH, donc les binaires locaux auront toujours la priorité sur les binaires globaux. Presque tout le temps, c'est ce que vous voulez, mais cela vaut la peine de savoir que c'est comme ça que ça fonctionne (j'ai récemment eu un bug lié à cela).

ÉDITER:

Je ne sais pas à quel moment de l'histoire de npm cela a changé, mais npm run <script-name> fonctionne maintenant (pas besoin de faire npm run-script <script-name> plus). Peut-être run-script fonctionne toujours aussi bien. Je m'y attendrais, mais je ne l'ai pas essayé.

36
tandrewnichols

Comment puis-je configurer package.json pour fonctionner à la fois sur Windows et Unix?

Si vous

  • utiliser Windows
  • n'aime pas l'installation globale de -g

... c'est une solution de travail

"scripts": {
  "test": "node node_modules/mocha/bin/mocha.js"
},

Notes:

  • mettre node devant ne devrait pas nuire et peut aider sous Windows (l'extension .js n'est pas nécessairement enregistrée dans l'exécutable nodejus, sauf si vous le définissez ainsi. Pourrait ouvrir un éditeur de texte, un IDE ou (pire) hôte de script Windows, Internet Explorer…)
  • L'adresse du script vous évite directement d'avoir besoin d'une installation globale. (Ne pas juger si c'est une bonne pratique)
  • les barres obliques aident à s'exécuter sous Linux (évidemment) et fonctionnent sous Windows (dans ce scénario. Évite également un piège Windows: les barres obliques inverses si utilisées, devraient être doublées - car elles sont interprétées comme échappant à la lettre suivante si elles sont utilisées isolément).
15
Frank Nocke

N'utilisez pas de solution globale, je vous suggère de suivre ce que les gars de Mocha disons :

"scripts": {  
    "test": "node_modules/.bin/mocha -w"
 },
10
igorludi

Utilisation npm i mocha --save-dev

Cela enregistrera le module en tant que dépendance de développement et npm configurera automatiquement les exécutables à utiliser dans l'objet scripts. Si vous souhaitez utiliser les exécutables en dehors des scripts définis dans package.json, vous pouvez également l'installer globalement, bien que vous puissiez vous retrouver avec différentes versions du package.

Si vous ne l'installez que globalement, d'autres personnes ne seront pas satisfaites si elles essaient d'exécuter vos tests (avec la norme npm test)

5
1j01

La nouvelle façon avec la nouvelle version de npm après 6.x, vous n'avez plus besoin d'installer mocha avec le mode global.

"scripts": { "test": "npx mocha" }

npx est installé automatiquement avec une nouvelle installation de npm. Il recherchera mocha dans node_modules/.bin ou $ PATH

référence: https://www.npmjs.com/package/npx

1
Bill