【问题标题】:npm package.json bin won't work on Windowsnpm package.json bin 在 Windows 上不起作用
【发布时间】:2014-10-09 14:40:15
【问题描述】:

我正在尝试通过 package.json bin 属性启动我的 cli 工具。

我有以下几点:

...
"name": "mycli",
"bin": "./bin/mycli",
...

当我在包路径中打开 cmd 并输入:“mycli”时,它说该命令无法识别。

我应该运行 npm 命令吗?或使用脚本属性?我是否试图错误地访问 bin 属性?

【问题讨论】:

    标签: windows node.js npm command-line-interface bin


    【解决方案1】:

    尝试在bin 属性中指定cli 工具的名称,例如:

    "bin": {
      "mycli": "./bin/mycli" // or "/bin/mycli.js" if it's a .js file
    }
    

    然后,从您的项目文件夹中运行npm link,以创建指向当前文件夹的全局符号链接。

    不要忘记在package.json 文件中的bin 属性之前添加"preferGlobal": "true" 属性,以警告用户全局安装您的模块。

    【讨论】:

    • /bin/mycli 的工作方式与./bin/mycli 不同吗?对我来说看起来一样......
    【解决方案2】:

    每当我试图让我的应用程序链接时,我一直在 Windows 上遇到问题,在路径上执行的生成脚本会尝试使用默认的 Windows 可执行文件运行 *.js 文件(我不知道那会是什么)。我不确定为什么。我认为这可能是因为它是一个 JavaScript 文件。但是,我将生成的脚本与我安装的其他一些模块进行了比较,发现如果我让package.json 引用的bin 文件表现得好像要在*nix 机器上执行一样, npm 会自动尝试添加对节点的调用。

    例如:

    如果我的package.json 看起来像这样:

    myapp/package.json

    "name": "myapp",
    "bin": {
        "myapp": "./bin/myapp"
    }
    

    我引用的 bin 文件如下所示:

    myapp/bin/myapp

    #!/usr/bin/env node
    require("../server.js");
    

    myapp 目录中运行npm link 命令,出现在%APPDATA%\npm 中的2 个生成的可执行文件如下所示(在根目录中将有package.json):

    我的应用程序

    #!/bin/sh
    basedir=`dirname "$0"`
    
    case `uname` in
        *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
    esac
    
    if [ -x "$basedir/node" ]; then
      "$basedir/node"  "$basedir/node_modules/myapp/bin/myapp" "$@"
      ret=$?
    else 
      node  "$basedir/node_modules/myapp/bin/myapp" "$@"
      ret=$?
    fi
    exit $ret
    

    myapp.cmd

    @IF EXIST "%~dp0\node.exe" (
      "%~dp0\node.exe"  "%~dp0\node_modules\myapp\bin\myapp" %*
    ) ELSE (
      node  "%~dp0\node_modules\myapp\bin\myapp" %*
    )
    

    请记住,我不需要明确地创建上面的 2 个文件,我只需要将文件作为 package.json 中的 bin 文件执行。 npm 创建了文件。


    行尾

    我在使用此方法时遇到的另一件事要注意,请绝对确保您的行尾是正确的。我注意到每当我在 *nix 机器上安装时,我的 bin 都会出错:“:没有这样的文件或目录”,因为行尾不正确。感谢View line-endings in a text file 例如如何打印可见的行尾。

    例如,如果您运行 cat -e PATH_TO_BIN 并得到如下内容:

    #!/usr/bin/env node^M$
    ^M$
    require("../index.js");^M$
    

    您使用了错误的行尾。如果你得到这样的东西:

    #!/usr/bin/env node$
    $
    require("../index.js");$
    

    那些应该是正确的行尾。

    【讨论】:

    • “#!/usr/bin/env 节点”解决了我的问题,即节点未执行 bin js 脚本。 THX
    【解决方案3】:

    如果你放

    #!/usr/bin/env node
    

    在脚本的第一行,npm 将创建必要的包装脚本。

    【讨论】:

      【解决方案4】:

      来自 Rodrigo Medeiros 的回答对我有用,但前提是我在 .js 文件中也有 shebang 行。

      还有一个问题。我在 c:\Program files\nodejs 安装了 node.js,这是我的 shebang 行:

      #!c:/program files/nodejs/node
      

      这不起作用,因为空白。这是正确的:

      #!c:/progra~1/nodejs/node
      

      【讨论】:

        猜你喜欢
        • 2023-04-03
        • 1970-01-01
        • 2020-02-20
        • 1970-01-01
        • 1970-01-01
        • 2018-10-20
        • 2018-06-22
        • 1970-01-01
        • 2021-07-28
        相关资源
        最近更新 更多