我正在尝试通过package.json bin
属性启动我的cli工具。
我有以下内容:
...
"name": "mycli",
"bin": "./bin/mycli",
...
当我打开包路径中的cmd并输入:" mycli"它说该命令无法识别。
我应该运行npm命令吗?或使用脚本属性?我是否尝试错误地访问bin属性?
答案 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
看起来像这样:
"name": "myapp",
"bin": {
"myapp": "./bin/myapp"
}
我引用的bin文件如下所示:
#!/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
):
@IF EXIST "%~dp0\node.exe" (
"%~dp0\node.exe" "%~dp0\node_modules\myapp\bin\myapp" %*
) ELSE (
node "%~dp0\node_modules\myapp\bin\myapp" %*
)
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将创建必要的包装脚本。