通过 npm 全局安装的 cli node/coffeescript 应用程序出现语法错误

Syntax error occurs with cli node/coffeescript app installed globally via npm

我有一个用咖啡脚本编写的 cli 应用程序。 cli 应用程序使用 commander (https://github.com/tj/commander.js) 来获取参数。我的 bin 目录中有三个文件:

mediatidy
mediatidy-config
mediatidy-media

如果我在 bash 的项目文件夹中运行 bin/mediatidy,指挥官执行得很好。如果我在 bash 中键入 bin/mediatidy configbin/mediatidy media 指挥官也执行正常并正在等待 <action>.

奇怪的是我将项目发布到 npm 并在全局安装时得到不同的结果。如果我通过 sudo npm mediatidy -g 安装项目(我正在使用 Mac OSX 10.10)我可以在 /usr/local/bin/ 中看到以下文件:

mediatidy
mediatidy-config
mediatidy-media

如果我在 bash 的项目文件夹中运行 bin/mediatidy,指挥官执行得很好。如果我在 bash 中键入 bin/mediatidy configbin/mediatidy media,我会收到以下错误:

mediatidy config

/usr/local/lib/node_modules/mediatidy/bin/mediatidy-config:3
program = require 'commander'
              ^^^^^^^^^^^
SyntaxError: Unexpected string
     at Module._compile (module.js:439:25)
     at Object.Module._extensions..js (module.js:474:10)
     at Module.load (module.js:356:32)
     at Function.Module._load (module.js:312:12)
     at Function.Module.runMain (module.js:497:10)
     at startup (node.js:119:16)
     at node.js:906:3
Looks like a coffeescript compilation error... wat.

如果我运行相同的命令但使用破折号 bin/mediatidy-config,它工作正常。我有另一个私有应用程序,无需使用全局安装的破折号即可运行。我在这里错过了什么?

编辑:添加了我的 package.json 文件:

package.json:

{
  "preferGlobal": true,
  "main": "index",
  "name": "mediatidy",
  "description": "Keep your media nice and tidy!",
  "version": "0.1.1",
  "repository": {
    "type": "git",
    "url": "git@github.com:tkdan235/mediatidy.git"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "directories": {
    "bin": "bin",
    "lib": "lib"
  },
  "dependencies": {
    "async": "^0.9.0",
    "coffee-script": "^1.8.0",
    "colors": "^0.6.2",
    "commander": "^2.1.0",
    "fs-extra": "^0.11.1",
    "lodash": "^2.4.1",
    "nconf": "^0.7.1",
    "node-dir": "^0.1.6",
    "node-ffprobe": "^1.2.2",
    "prompt": "^0.2.14",
    "sqlite3": "^2.2.7"
  },
  "coffeelintConfig": {
    "max_line_length": {
      "name": "max_line_length",
      "value": 120,
      "level": "error",
      "limitComments": true
    }
  }
}

这实际上似乎是 Commander.js 的限制。乍一看,它似乎没有将脚本称为 shell 脚本。相反,它使用不会编译 CoffeeScript 代码的节点调用它们。请参阅 https://github.com/tj/commander.js/blob/master/index.js#L447-L479(特别是第 469 行)。

更新:

经过一些进一步的挖掘,看起来这曾经是受支持和工作的。调用子命令的方式只是它们的脚本名称。然后这个拉取请求破坏了它:https://github.com/tj/commander.js/pull/173。此行为的最后一个工作版本是 2.1.0。您可以将您的版本固定为 2.1.0 以恢复此行为。