web-dev-qa-db-fra.com

Script «bin» du package NPM pour Windows

Cucumber.js fournit une ligne de commande "binaire" qui est un simple .js fichier contenant une instruction Shebang :

#!/usr/bin/env node
var Cucumber = require('../lib/cucumber');
// ...

Le binaire est spécifié dans package.json avec le "bin" clé de configuration:

{ "name" : "cucumber"
, "description" : "The official JavaScript implementation of Cucumber."
// ...
, "bin": { "cucumber.js": "./bin/cucumber.js" }
// ...

Tout cela fonctionne bien sur les systèmes POSIX. Quelqu'un a signalé n problème lors de l'exécution de Cucumber.js sous Windows.

Fondamentalement, le .js le fichier semble être exécuté via l'interpréteur JScript de Windows (pas Node.js) et il génère une erreur de syntaxe en raison de l'instruction Shebang.

Ma question est: quelle est la méthode recommandée pour configurer un script "binaire" qui fonctionne sur les systèmes UNIX et Windows?

Merci.

37
jbpros

Windows ignore la ligne Shebang #!/usr/bin/env node et l'exécutera selon le .js association de fichier. Soyez explicite sur l'appel de votre script avec le nœud

node hello.js

ps. Pédanterie: les shebangs ne sont pas dans la norme POSIX mais ils sont pris en charge par la plupart des systèmes * nix.


Si vous empaquetez votre projet pour Npm, utilisez le champ 'bin' dans package.json . Ensuite, sous Windows, Npm installe un .cmd wrapper à côté de votre script pour que les utilisateurs puissent l'exécuter à partir de la ligne de commande

hello

Pour que npm crée le droit de shim, le script doit avoir la ligne Shebang#!/usr/bin/env node

56
Colonel Panic

votre "bin" devrait être "cucumber" npm créera un fichier "cucumber" ou "cucumber.cmd" pointant vers "node% SCRIPTNAME%". le premier étant pour les environnements posix, le second étant pour l'utilisation de Windows ... Si vous voulez que le "js" fasse partie du nom de l'exécutable ... vous devriez utiliser un hyphon à la place ... "cucumber-js" ... Le fait d'avoir un fichier .js viendra avant le .js.cmd dans votre cas, ce qui obligera l'interpréteur WScript à l'exécuter en tant que fichier JScript, pas en tant que script de nœud.

Je suggère de regarder package.json de coffee-script pour un bon exemple.

{
  "name":         "coffee-script",
  "description":  "Unfancy JavaScript",
  "keywords":     ["javascript", "language", "coffeescript", "compiler"],
  "author":       "Jeremy Ashkenas",
  "version":      "1.4.0",
  "licenses":     [{
    "type":       "MIT",
    "url":        "https://raw.github.com/jashkenas/coffee-script/master/LICENSE"
  }],
  "engines":      {
    "node":       ">=0.4.0"
  },
  "directories" : {
    "lib" : "./lib/coffee-script"
  },
  "main" : "./lib/coffee-script/coffee-script",
  "bin":          {
    "coffee":     "./bin/coffee",
    "cake":       "./bin/cake"
  },
  "scripts": {
    "test": "node ./bin/cake test"
  },
  "homepage":     "http://coffeescript.org",
  "bugs":         "https://github.com/jashkenas/coffee-script/issues",
  "repository":   {
    "type": "git",
    "url": "git://github.com/jashkenas/coffee-script.git"
  },
  "devDependencies": {
    "uglify-js":  ">=1.0.0",
    "jison":      ">=0.2.0"
  }
}
6
Tracker1