无法在Linux中安装和运行我自己的npm模块

时间:2017-01-10 17:20:51

标签: node.js linux bash npm

我已经创建了一个我打算发布的npm模块,但是没有测试它是否可以先发布。所以我安装了我正在使用的模块npm install -g .,它在我的Windows计算机上运行良好,但它不能在我的Linux(Debian)计算机上运行。相反,我收到以下错误:

15:52 $ transval
: No such file or directory

到目前为止,我在Windows计算机上比较生成的cmd和bash文件时,我发现的唯一事情是,当遇到(例如,'gulp')时,cmd文件在结构中与bash文件完全相同不是。设置basedir的第二行不同。这是我模块发布的bash文件的完整输出:

#!/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/transval/bin/transval.bin.js" "$@"
  ret=$?
else 
  node  "$basedir/node_modules/transval/bin/transval.bin.js" "$@"
  ret=$?
fi
exit $ret

但如果我将前两行与任何其他文件进行比较,则会有显着差异!这是来自任何其他模块的前两行,例如gulp:

#!/bin/sh
basedir=`dirname "$0"`

所有其他bash文件都会获得该dirname。如果我将我的bash文件更改为基于它的,它会突然起作用。这让我很生气!

修改 这两个文件是在我运行命令npm install -g .(因此全局安装我的包以进行测试)或我已发布(即npm publish)时创建的,所以我不生成这些文件自

我的package.json有一个bin条目,它指向一个如下所示的文件:

#!/usr/bin/env node

var app = require('../bundle.js');
app.init(process.argv);

任何人都知道为什么它可以在Windows上运行而不是在Linux中运行?

2 个答案:

答案 0 :(得分:1)

修改根据the OP's answer中的其他信息,这确实是一个行结束问题。问题实际上与$()``无关。

在Windows上生成时,行以回车符和换行符\r\n结束。但是,在Debian上运行生成的脚本时,只有\n被视为行尾。因此,basedir的分配实际上是:

basedir=$(dirname "...")$'\r'
                      # ^^^^^ Carriage return!  Oops!

我认为这就是为什么错误消息是':没有这样的文件或目录'::之前,实际打印$basedir的内容,以\r结束。 \r将光标移回到行的开头,然后以:开头的错误消息的其余部分覆盖了路径。 (但这是猜测 - 我无法在我的系统上重现确切的错误消息。)

解决方法是在分配后添加# basedir(空格哈希):

basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") #
                                         # add these ^^

这样\r将成为评论的一部分,而不是basedir的一部分。

注意:有关获取$basedir的其他方式,请参阅this question and its answers

每次聊天时,OP明天会为这两个选项添加$basedir值。

供参考,这是我们目前所处的位置:

  • 根据this answernpm根据bin中的package.json条目生成包装脚本。
  • npm使用cmd-shim模块制作脚本。
  • cmd-shim已更新2013/10/28以使用dirname ... echo ... sed序列,以便它可以在msysgit上运行。
  • gulp和使用dirname "$0"的其他脚本可能是在更新之前cmd-shim生成的。
  • OP的Debian /bin/shapparently dash(目前0.5.7-4 in debian stable)。
    • 对于OP,在Debian上,bash是版本:4.3.46(1)-release和sed是版本4.2.2
    • 我在Cygwin dash 0.5.8-3上尝试了两种basedir类型,但它们都有效。

在Ubuntu上,OP有一个不同的问题:/usr/bin/env: 'node\r': No such file or directory。对我来说,这看起来像是一个终结问题,可能与Debian问题不同。

答案 1 :(得分:1)

好的,发现了问题。从Windows发布似乎一直存在问题。 从Linux发布后(本例中为Ubuntu)我可以在Linux和Windows计算机上安装它。 我不确定这是什么原因,无论是一些npm bug还是打瞌睡换行问题,但现在它正在工作:)

我之前尝试过从Linux发布过,但是失败了,但是使用旧版本的Node(4.something)并且没有用,但是现在我升级到了最新版本并且运行良好,所以可能与它有关。

修改 我现在可以验证在运行节点6.2.2的Debian机器上发布会创建一个不可用的已发布版本,而在运行节点7.4.0的Ubuntu机器上发布效果很好,可以在任何地方安装和运行。两台机器都运行npm版本4.0.5。