42

Cucumber.js 提供了一个命令行“二进制”,它是一个.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 系统的“二进制”脚本的推荐方法是什么?

谢谢。

4

3 回答 3

67

Windows 会忽略 shebang 行#!/usr/bin/env node,并会根据.js文件关联执行它。明确使用节点调用脚本

node hello.js

附言。Pedantry:shebangs不在POSIX 标准中,但大多数 *nix 系统都支持它们。


如果您为 Npm 打包项目,请使用package.json中的“bin”字段。然后在 Windows 上,Npm 将在.cmd您的脚本旁边安装一个包装器,以便用户可以从命令行执行它

hello

为了让 npm 正确创建 shim,脚本必须有 shebang 行 #!/usr/bin/env node

于 2012-05-01T13:44:48.910 回答
6

你的“bin”应该是“cucumber” npm 将创建一个指向“node %SCRIPTNAME%”的“cucumber”或“cucumber.cmd”文件。前者用于 posix 环境,后者用于 Windows ......如果你希望“js”成为可执行文件名称的一部分......你应该使用连字符......“cucumber-js”......在您的情况下,拥有 .js 文件将位于 .js.cmd 之前,导致 WScript 解释器将其作为 JScript 文件而不是节点脚本运行。

我建议看一下咖啡脚本的 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"
  }
}
于 2012-10-26T17:09:46.507 回答
0

我设法找到了解决类似问题的方法。

我最初的计划是只.js为 API 和 CLI 提供一个大文件(原因是因为当时我不知道如何在两个文件之间共享变量)。当一切都建成后,我试图将#!/usr/bin/env nodeshebang 添加到我的文件中。但是,这并没有阻止 Windows Script Host 给出错误。

我最终做的是想出了一个“变量桥”的想法,它允许使用getVarand读取和设置变量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...
    
  • 使用mainbinin相同的名称package.json对我来说似乎是个问题。

于 2021-01-23T13:29:44.740 回答