我正在开发一个需要从shell运行的节点包。我知道我必须全局安装软件包,但是要运行
$> npm install -g ./my_module
没有给我想要的结果,即正在运行
$> my_module
结果
my_module: : command not found
而不是运行我的节点包的入口点(index.js
)。
我觉得我在这里错过了一些明显的东西,我做错了什么?
答案 0 :(得分:14)
请尝试包装模块并安装。
npm pack
然后在全局范围内安装
npm i -g my_module-0.0.1.tgz
让我知道这是否有效
答案 1 :(得分:2)
我最近遇到了同样的问题。我将模块开发为CLI,旨在能够从任何地方调用它,将其发布到MPM注册表,并使用-g
选项进行安装,但是从命令行调用它时,我仍然得到{ {1}}错误。诀窍就是将command not found
属性添加到bin
文件中。
许多软件包都具有一个或多个要安装到PATH中的可执行文件。 npm使此操作非常容易(实际上,它使用此功能来安装“ npm”可执行文件。)
要使用此功能,请在package.json中提供一个
package.json
字段,该字段是命令名到本地文件名的映射。安装时,npm会将文件符号链接到bin
进行全局安装,或prefix/bin
进行本地安装。
意味着您的./node_modules/.bin/
文件应如下所示:
package.json
如果只希望指定一个命令,则该属性可以是单个字符串,如果希望指定多个命令,则该属性可以是映射。现在,您应该可以从命令行中的任何地方调用{
"name": "foo-cli",
"version": "1.0.0",
"description": "A CLI to do Foo-ish things.",
"bin": {
"foo": "./cli.js"
},
"main": "main.js",
...
}
。
答案 2 :(得分:0)
设置正确的package.json
配置(主要使用{"bin": {...}}
)后,您无需将其发布到NPM注册表中,然后再次下载即可查看其工作。
npm link
正是针对这种情况。如offical documentation中所述:
软件包文件夹中的
npm link
将在全局文件夹{prefix} / lib / node_modules /中创建一个符号链接,该链接链接到执行npm link命令的软件包。
假设您有这个项目:
-- my_module
-- -- index.js
-- -- cli.js
-- -- package.json
您有这个package.json
:
{
"name": "my_module",
"preferGlobal": true,
"bin": {
"my_module": "cli.js"
},
}
运行:
cd my_module
然后:
npm link
现在npm将在您的计算机中全局安装软件包。它将检查package.json
中是否有bin
条目,并将my_module
链接到cli.js
文件。这将通过在全局npm目录中创建到当前目录的符号链接来实现。
现在,如果您在命令行中运行:
my_module
它将指向cli.js
文件。如果您更改了cli.js
的内容,它将在您下次运行my_module
时反映出来,如果您将my_module
重命名为my_module2
,请使用npm unlink
然后使用{{1 }}。
另外,npm可以使用完整的URL作为软件包名称,它将使用完整的URL下载并安装软件包,而不是查看npm注册表,您可以从自己的私有Git主机安装软件包,例如:
npm link