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

时间:2014-08-15 20:16:08

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

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

我有以下内容:

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

当我打开包路径中的cmd并输入:" mycli"它说该命令无法识别。

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

4 个答案:

答案 0 :(得分:19)

尝试在cli媒体资源中指定bin工具的名称,例如:

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

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

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

答案 1 :(得分:16)

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

例如:

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

的myapp /的package.json

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

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

的myapp / bin中/ MyApp的

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

%APPDATA%\npm中显示的2个生成的可执行文件通过在npm link目录中运行命令myapp来显示如下(在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

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

myapp.cmd

bin

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


行结尾

另外需要注意的是,我在使用此方法时遇到了问题,请确保您的行结尾是正确的。我注意到我的垃圾箱出错了:":没有这样的文件或目录"每当我在* nix机器上安装时,因为行结尾不正确。感谢View line-endings in a text file,例如如何打印可见的行结尾。

例如,如果您运行#!/usr/bin/env node^M$ ^M$ require("../index.js");^M$ 并获得以下内容:

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

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

{{1}}

那些应该是正确的行结尾。

答案 2 :(得分:2)

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

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

#!c:/program files/nodejs/node

这没用,因为空白。这是正确的:

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

答案 3 :(得分:0)

如果你把

#!/usr/bin/env node

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