我已经创建了一个我打算发布的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中运行?
答案 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
值。
供参考,这是我们目前所处的位置:
npm
根据bin
中的package.json
条目生成包装脚本。npm
使用cmd-shim模块制作脚本。cmd-shim
已更新2013/10/28以使用dirname ... echo ... sed
序列,以便它可以在msysgit上运行。gulp
和使用dirname "$0"
的其他脚本可能是在更新之前cmd-shim
生成的。/bin/sh
是apparently dash
(目前0.5.7-4 in debian stable)。
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。