NPM包';bin';Windows脚本
Cucumber.js提供了一个命令行“binary”,它是一个简单的NPM包';bin';Windows脚本,windows,node.js,posix,package,npm,Windows,Node.js,Posix,Package,Npm,Cucumber.js提供了一个命令行“binary”,它是一个简单的.js文件,包含一条shebang指令: #!/usr/bin/env node var Cucumber = require('../lib/cucumber'); // ... 二进制文件在package.json中使用“bin”配置键指定: { "name" : "cucumber" , "description" : "The official JavaScript implementation of Cucumbe
.js
文件,包含一条shebang指令:
#!/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时报告
基本上,.js
文件似乎是通过Windows的JScript解释器(而不是Node.js)执行的,它会因为shebang指令而抛出语法错误
我的问题是:在UNIX和Windows系统上设置“二进制”脚本的推荐方法是什么
谢谢。Windows忽略了shebang行
#/usr/bin/env节点
,并将根据.js
文件关联执行它。明确使用节点调用脚本
node hello.js
附言:shebangs不在POSIX标准中,但它们受到大多数*nix系统的支持
如果为Npm打包项目,请使用中的“bin”字段。然后在Windows上,Npm将在脚本旁边安装一个
.cmd
包装器,以便用户可以从命令行执行它
hello
要使npm正确创建垫片,#/usr/bin/env node
您的“bin”应该是“cucumber”。npm将创建一个指向“节点%SCRIPTNAME%”的“cucumber”或“cucumber.cmd”文件。前者用于posix环境,后者用于windows。。。如果您希望“js”成为可执行文件名的一部分。。。你应该用连字符来代替。。。“黄瓜js”。。。在本例中,在.js.cmd之前会有一个.js文件,这会导致WScript解释器将其作为JScript文件而不是节点脚本运行
我建议看一个好的例子
{
"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"
}
}
我设法找到了解决类似问题的办法 我最初的计划是,对于API和CLI,只有一个大的
.js
文件(原因是当时我不知道如何在两个文件之间共享变量)。当所有的东西都建立起来时,我试着添加#/usr/bin/env节点
shebang到我的文件。然而,这并没有阻止Windows脚本主机给出错误
最后我想到了一个“变量桥”,它允许使用getVar
和setVar
读取和设置变量。这使得我不得不从API代码中提取CLI代码,并向变量桥添加一些导入
在CLI文件中,我添加了shebang,并将项目的package.json
修改为:
{
...
“main”:“/bin/api.js”,
“bin”:{
“验证程序”:“/bin/cli.js”
}
...
}
下面是一些小提示,我认为如果Windows脚本主机仍然出现错误,它们可能会有所帮助(我应用了所有这些提示,所以我不确定哪一个有帮助):
- 仅使用LF行结尾似乎有帮助
- 似乎
是编译文件的首选目录。我确实试过/bin
,但它对我不起作用/dist
- 在shebang之后可能需要一条空行:
//cli.js #!/usr/bin/env节点 //代码。。。
- 在
中为package.json
和main
使用相同的名称对我来说似乎是个问题bin
cucumber.js
和cumber.js.cmd
windows友好的二进制文件。由于Windows处理文件“扩展名”的方式,当一个人键入node\u modules\.bin\cucumber.js
时,它通过JScript运行.js
文件,而不是.cmd
文件。谢谢你那迂腐的附言;)我遇到了完全相同的问题。我正在尝试找到一种解决方案,它不需要我告诉Windows用户键入其他命令。抢占npm生成的.cmd的JavaScript文件在Windows脚本主机中执行;我希望有一种方法可以利用它来代理节点驱动的CLI:如何让它由nodejs而不是microsoft jscript执行?即使将其更改为节点。/index.js
也无法使其正常工作。更正:重新执行npm链接
seemd to work我与您有相同的问题,错误为enoint:没有这样的文件或目录,chmod'C:\Users\\AppData\Roaming\npm\node\u modules\\node.\index.js'
。在package.json“bin”中:{“”:“node./index.js”}
您是如何解决的?好的,我添加了#/usr/bin/env节点
,即使它适用于windows并且正在工作。