Cucumber.js提供了一个命令行“binary”,它是一个包含 shebang 指令的简单.js
文件:
#!/usr/bin/env node
var Cucumber = require('../lib/cucumber');
// ...
二进制文件在package.json
中使用"bin"
配置密钥指定:
{ "name" : "cucumber"
, "description" : "The official JavaScript implementation of Cucumber."
// ...
, "bin": { "cucumber.js": "./bin/cucumber.js" }
// ...
这一切都适用于POSIX系统。有人在Windows上运行Cucumber.js时报告了an issue。
基本上,.js
文件似乎是通过Windows的JScript解释器(而不是Node.js)执行的,并且由于shebang指令而导致语法错误。
我的问题是:建议在UNIX和Windows系统上运行的“二进制”脚本的推荐方法是什么?
感谢。
答案 0 :(得分:51)
Windows忽略了shebang行#!/usr/bin/env node
并将根据.js
文件关联执行它。明确用节点
node hello.js
PS。 Pedantry:shebangs 在POSIX标准中不是,但大多数* nix系统都支持它们。
如果您将项目打包为Npm,请使用package.json中的“bin”字段。然后在Windows上,Npm将在脚本旁边安装.cmd
包装器,以便用户可以从命令行执行它
hello
要让npm创建垫片,the script must have the shebang line #!/usr/bin/env node
答案 1 :(得分:5)
你的“bin”应该是“cucumber”npm会创建一个指向“node%SCRIPTNAME%”的“cucumber”或“cucumber.cmd”文件。前者用于posix环境,后者用于windows使用...如果你想让“js”成为可执行文件名的一部分......你应该使用hyphon代替......“cucumber-js”......在您的情况下,.js文件将出现在.js.cmd之前,导致WScript解释器将其作为JScript文件而不是节点脚本运行。
我建议您查看coffee-script's package.json作为一个好例子。
{
"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"
}
}
答案 2 :(得分:0)
我设法找到了解决类似问题的方法。
我最初的计划是只为 API 和 CLI 创建一个大的 .js
文件(原因是当时我不知道如何在两个文件之间共享变量)。当一切都构建好后,我尝试将 #!/usr/bin/env node
shebang 添加到我的文件中。但是,这并没有阻止 Windows Script Host 出现错误。
我最终想出了一个“变量桥”的想法,允许使用 getVar
和 setVar
读取和设置变量。这让我不得不从 API 代码中提取 CLI 代码并向变量桥添加一些导入。
在 CLI 文件中,我添加了shebang,并将我的项目的 package.json
修改为:
{
...
"main": "./bin/api.js",
"bin": {
"validator": "./bin/cli.js"
}
...
}
这里有一些小注意事项,我认为如果 Windows Script Host 仍然出现错误,它们可能会有所帮助(我应用了所有这些注意事项,所以我不确定哪一个有帮助):
仅使用 LF 行结尾似乎有帮助。
似乎 ./bin
是编译文件的首选目录。我确实尝试过 ./dist
,但它对我不起作用。
可能需要在 shebang 后面加一个空行:
// cli.js
#!/usr/bin/env node
// code...
在 main
中对 bin
和 package.json
使用相同的名称对我来说似乎是个问题。