NPM包';bin';Windows脚本

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

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 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
    使用相同的名称对我来说似乎是个问题


问题在于以“.js”后缀结尾的二进制脚本名称。NPM基于“bin”配置指令创建unix友好的
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并且正在工作。