node.js - 全局安装的 npm-package 未运行
问题描述
我刚刚在 npm 中发布了一个新包,但它没有按预期运行。
全局运行“poker-odds-calc”会产生这个错误:
/c/Users/username/AppData/Roaming/npm/poker-odds-calc:第 1 行:/node_modules/poker-odds-calc/dist/lib/bin/poker-odds-calc.js:没有这样的文件或目录
AppData\Roaming\npm\poker-odds-calc "$basedir/node_modules/poker-odds-calc/dist/lib/bin/poker-odds-calc.js" "$@" 退出 $?
以上内容是该模块不作为全局模块运行的原因,但我不知道如何强制 npm 将正确的内容添加到该文件中。
#!/bin/sh
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
case `uname` in
*CYGWIN*) basedir=`cygpath -w "$basedir"`;;
esac
if [ -x "$basedir/node" ]; then
"$basedir/node" "$basedir/node_modules/poker-odds-calculator/dist/bin/poker-odds-calculator.js" "$@"
ret=$?
else
node "$basedir/node_modules/poker-odds-calculator/dist/bin/poker-odds-calculator.js" "$@"
ret=$?
fi
exit $ret
解决方案
您在命令行脚本中缺少 shebang 字符序列。因此,NPM 无法正确安装二进制文件。
解决方案
您需要在 typescript 命令行源 (/src/lib/bin/poker-odds-calc.ts) 的顶部添加一个 shebang 字符序列。换句话说,文件的顶部需要如下所示:
#!/usr/bin/env node
import * as argv from "argv";
import Table from "../Table";
import {CardsFromString, Log} from "../Utils";
安装包后,NPM 将在 package.json 的“bin”配置中定义的每个文件中查找第一行,并在您的操作系统中采取相应的行动。在 Windows 中,NPM 根据您在顶部定义的内容创建不同类型的二进制文件。如果存在节点 shebang,NPM 会创建一个二进制文件,尝试使用节点执行命令行脚本(类似于您在上面想要的内容)。如果省略 shebang,NPM 会创建一个代理二进制文件,将责任外包给 Windows(如您所见,可能会失败)。
参考
https://medium.com/netscape/a-guide-to-create-a-nodejs-command-line-package-c2166ad0452e
推荐阅读
- javascript - 将 html 文件转换为 jpg/png
- python - 如何使用命令在 Linux 中同时运行相同的 python 代码
- mysql - 在 sequelize 中使用带或条件的 where 子句
- python - Pygame 玩家移动
- java - org.hibernate.exception.SQLGrammarException:无法在 heroku 中提取 ResultSet
- java - CMD/PowerShell: 'javac' 不是内部或外部命令、可运行程序或批处理文件
- google-chrome-extension - 在不同的 chrome 配置文件中打开松弛链接(用户)
- r - R中一组图的多个标题
- python - 在 Python 中重塑数组大小(Numpy)
- javascript - 在 JavaScript 对象中创建一个函数然后创建属性有什么意义?