在全球安装本地开发的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已安装的模块。 但是,如果上传不是一个选项,这是如何避免它。