全局安装本地开发的npm包

Kub*_*lik 13 package node.js npm

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

$> npm install -g ./my_module
Run Code Online (Sandbox Code Playgroud)

没有给我想要的结果,那就是正在运行

$> my_module
Run Code Online (Sandbox Code Playgroud)

结果是

my_module: : command not found
Run Code Online (Sandbox Code Playgroud)

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

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

小智 34

设置正确的package.json配置后,(主要使用{"bin": {...}}),您不必将其发布到 NPM 注册表,然后再次下载以查看它的工作情况。

npm link正是针对这种情况而制作的。如官方文档中所述

npm link 在包文件夹中,将在全局文件夹 {prefix}/lib/node_modules/ 中创建一个符号链接,该符号链接链接到执行 npm 链接命令的包。

假设你有这个项目:

-- my_module

-- -- index.js
-- -- cli.js
-- -- package.json
Run Code Online (Sandbox Code Playgroud)

你有这个package.json

{
  "name": "my_module",
  "bin": {
    "my_module": "cli.js"
  },
}
Run Code Online (Sandbox Code Playgroud)

跑:

cd my_module
Run Code Online (Sandbox Code Playgroud)

然后:

npm link
Run Code Online (Sandbox Code Playgroud)

现在 npm 将在你的机器上全局安装你的包。它会检查package.jsonbin条目,它会链接my_modulecli.js文件。这将通过在全局 npm 目录中创建指向当前目录的符号链接来实现。

现在,如果您在命令行中运行:

my_module
Run Code Online (Sandbox Code Playgroud)

它将指向该cli.js文件。如果您更改了cli.js内容,它将在您下次运行时反映出来my_module,如果您重命名my_modulemy_module2npm unlinknpm link再次使用。


另一方面,npm 可以使用完整的 url 作为包名,它将使用完整的 url 来下载和安装包,而不是查看 npm 注册表,您可以从自己的私有 Git 主机安装包,例如:

npm install -g https://github.com/Me/my_module
Run Code Online (Sandbox Code Playgroud)


小智 22

请尝试包装模块并安装。

npm pack
Run Code Online (Sandbox Code Playgroud)

然后在全球范围内安装

npm i -g my_module-0.0.1.tgz
Run Code Online (Sandbox Code Playgroud)

让我知道这是否有效

  • 当您想在开发时进行调试时,“npm link”非常有用。但一旦经过充分测试,我认为这个解决方案是合适的。 (2认同)

Mig*_*g82 5

我最近遇到了同样的问题。我将我的模块开发为 CLI,目的是能够从任何地方调用它,将它发布到 NPM 注册表并使用该-g选项安装它,但是当从命令行调用它时,我仍然收到command not found错误消息。将bin属性添加到package.json文件就是诀窍。

NPM 文档

很多包都有一个或多个他们想要安装到 PATH 中的可执行文件。npm 使这变得非常简单(实际上,它使用此功能来安装“npm”可执行文件。)

要使用它,请bin在 package.json 中提供一个字段,它是命令名到本地文件名的映射。在安装时,npm 会将该文件符号链接到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",
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果您只想指定一个命令,则该属性可以是单个字符串,如果您希望指定多个命令,则该属性可以是一个映射。现在您应该能够foo从命令行的任何位置调用。