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 ??? :-)
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é.
Comment puis-je configurer package.json pour fonctionner à la fois sur Windows et Unix?
Si vous
... c'est une solution de travail
"scripts": {
"test": "node node_modules/mocha/bin/mocha.js"
},
Notes:
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…)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"
},
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
)
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