每当我试图让我的应用程序链接时,我一直在 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");$
那些应该是正确的行尾。