首页 > 解决方案 > 全局安装的 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

标签: node.jsnpm

解决方案


您在命令行脚本中缺少 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


推荐阅读