【发布时间】:2017-05-25 06:47:58
【问题描述】:
我创建了一个我打算发布的 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 文件都获得该目录名。如果我将我的 bash 文件更改为那个 basedir,它会突然起作用。快把我逼疯了!
编辑:
这两个文件是在我运行命令npm install -g .(从而全局安装我的包以进行测试)或发布时(即npm publish)创建的,所以我不会自己生成这些文件。 em>
我的 package.json 有一个 bin 条目,它指向一个如下所示的文件:
#!/usr/bin/env node
var app = require('../bundle.js');
app.init(process.argv);
有人知道为什么它可以在 Windows 上运行而不是在 Linux 上运行吗?
【问题讨论】:
-
echo/sed序列将反斜杠更改为正斜杠。两者在我的 cygwin 系统上都是一样的。你是如何生成 bash 文件的? --- 另外,我看到您有一个解决方法(手动更改生成的 bash 脚本)。您的问题是如何避免每次更新模块时都必须进行手动更改? -
另请参阅this question and its answers,了解更稳健地获取
$basedir的方法。 -
尝试使用
${0%/*}。我一直在 Mac、Linux 和 Windows(cygwin 和 mingw)的所有脚本中使用它。像魅力一样工作。 -
我已经稍微澄清了我的问题。当我通过
npm install -g .安装模块时会生成 cmd 和 bash 文件,所以我不知道它们是如何生成的,因此我不能只更改 basedir,因为它不适用于下载我的模块的其他人。 -
@cxw: bash 是版本:4.3.46(1)-release,sed 是版本 4.2.2 和 sh 不接受
sh --version:)