通过 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 config
或 bin/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 config
或 bin/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 以恢复此行为。
我有一个用咖啡脚本编写的 cli 应用程序。 cli 应用程序使用 commander
(https://github.com/tj/commander.js) 来获取参数。我的 bin 目录中有三个文件:
mediatidy
mediatidy-config
mediatidy-media
如果我在 bash 的项目文件夹中运行 bin/mediatidy
,指挥官执行得很好。如果我在 bash 中键入 bin/mediatidy config
或 bin/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 config
或 bin/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 以恢复此行为。