在全球安装本地开发的npm软件包

我正在开发一个需要从shell运行的节点包。 我知道我必须全球安装软件包,但运行

$> npm install -g ./my_module 

不给我想要的结果,即运行

 $> my_module 

结果是

 my_module: : command not found 

而不是运行我的节点包的入口点( index.js )。

我觉得我在这里错过了一些明显的东西,我做错了什么?

我今天自己就遇到了这个问题,这就是我所做的。

所以你不能做npm link -g your-module ,这将是非常棒的。

如果你已经将你的模块上传到npmregistry中,你必须手动执行npm install -g your-module 。 (我看到你最终这样做了,所以可能有点晚了,但下面解释了如何避免它。)

首先,findnpm在哪里存储全局安装的模块

 npm ls -g C:\Users\<in my case>\AppData\Roaming\npm 

该文件夹包含与node_modules文件夹中的模块名称相同的脚本。 这些是全球安装的模块。 当您从命令行运行<module-name>时,这里的脚本实际上负责执行node <module-name> 。 所以你真的只是执行这些脚本。

如果你已经将你的模块与npm链接起来(通过在你的模块目录中运行npm link ),那么你的模块应该已经存在了,否则先做。

然后创build将执行你的模块的命令行动作的脚本。 npm模块本身必须至less有一个这样的脚本,它应该是一个很好的指导。 复制粘贴你的模块的名字,并取代相关的细节

对于Windows: your-module.cmd

 @IF EXIST "%~dp0\node.exe" ( "%~dp0\node.exe" "%~dp0\node_modules\your-module\cli.js" %* ) ELSE ( node "%~dp0\node_modules\your-module\cli.js" %* ) 

对于* nix: 你的模块 (我不完全确定,因为我没有访问* nix机器,只是复制粘贴我发现的npm

 #!/bin/sh basedir=`dirname "$0"` case `uname` in *CYGWIN*) basedir=`cygpath -w "$basedir"`;; esac if [ -x "$basedir/node" ]; then "$basedir/node" "$basedir/node_modules/your-module/cli.js" "$@" ret=$? else node "$basedir/node_modules/your-module/cli.js" "$@" ret=$? fi exit $ret 

现在你的本地链接模块可以作为一个命令行工具。

我想这可能实际上更容易上传到npmregistry然后安装它,然后你可以用你的链接replace已安装的模块。 但是,如果上传不是一个选项,这是如何避免它。