npm package.json bin不能在Windows上运行

fun*_*err 14 windows command-line-interface bin node.js npm

我试图通过package.json bin属性启动我的cli工具.

我有以下内容:

...
"name": "mycli",
"bin": "./bin/mycli",
...
Run Code Online (Sandbox Code Playgroud)

当我打开包路径中的cmd并输入:"mycli"时,它表示该命令无法识别.

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

Rod*_*ros 20

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

"bin": {
  "mycli": "./bin/mycli" // or "/bin/mycli.js" if it's a .js file
}
Run Code Online (Sandbox Code Playgroud)

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

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


zer*_*298 16

每当我试图让我的应用程序链接时,我一直在Windows上遇到问题,在路径上执行的生成的脚本将尝试*.js使用默认的Windows可执行文件运行该文件(我不知道那将是什么).我不知道为什么.我想这可能是因为它是一个JavaScript文件.但是,我将生成的脚本与我安装的其他模块进行了比较,并想出如果我binpackage.jsonact 引用的文件视为在*nix机器上执行,npm则会自动尝试将调用添加到节点.

例如:

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

MYAPP /的package.json

"name": "myapp",
"bin": {
    "myapp": "./bin/myapp"
}
Run Code Online (Sandbox Code Playgroud)

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

MYAPP /斌/ MYAPP

#!/usr/bin/env node
require("../server.js");
Run Code Online (Sandbox Code Playgroud)

%APPDATA%\npm通过npm linkmyapp目录中运行命令(将package.json在根目录中),显示的2个生成的可执行文件显示如下:

MYAPP

#!/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
Run Code Online (Sandbox Code Playgroud)

myapp.cmd

@IF EXIST "%~dp0\node.exe" (
  "%~dp0\node.exe"  "%~dp0\node_modules\myapp\bin\myapp" %*
) ELSE (
  node  "%~dp0\node_modules\myapp\bin\myapp" %*
)
Run Code Online (Sandbox Code Playgroud)

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


行结尾

另外需要注意的是,在使用此方法时遇到了这种情况,请确保您的行结尾是正确的.我注意到我的bin错误地说:":没有这样的文件或目录"每当我安装在*nix机器上时,因为行结尾不正确.感谢查看文本文件中的行结尾,例如如何打印可见的行结尾.

例如,如果你运行cat -e PATH_TO_BIN并得到这样的东西:

#!/usr/bin/env node^M$
^M$
require("../index.js");^M$
Run Code Online (Sandbox Code Playgroud)

你使用错误的行结尾.如果你得到这样的东西:

#!/usr/bin/env node$
$
require("../index.js");$
Run Code Online (Sandbox Code Playgroud)

那些应该是正确的结局.

  • “#!/usr/bin/env node”解决了我的 bin js 脚本未由节点执行的问题。谢谢 (2认同)

And*_*eKR 6

如果你把

#!/usr/bin/env node
Run Code Online (Sandbox Code Playgroud)

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