在本地安装的npm包如何全局安装

62

我正在开发一个需要从shell中运行的node包。我知道我必须全局安装该软件包,但运行

$> npm install -g ./my_module

没有得到我想要的结果,也就是运行不了

$> my_module

结果在

my_module: : command not found

我不是直接运行我的Node包的入口文件(index.js),感觉好像漏了点什么,我做错了什么?


3
你能否添加你的 package.json 文件? - Ben Diamant
npm list -g 给出了全局安装模块所在的路径。 (查看) 尝试将您的包放在那里。 - laggingreflex
我已经尝试过了,但没有任何效果。我想我只需将该软件包发布到npm并结束今天的工作。 - Kuba Orlik
4
好的,我在package.json文件中缺少“bin”属性。我设置好了,问题解决了。 - Kuba Orlik
相关:https://dev59.com/pF8e5IYBdhLWcg3w0NGO - laggingreflex
3个回答

62

在正确设置package.json配置后(主要使用{"bin": {...}}),您无需将其发布到NPM注册表,然后再下载以查看其是否正常工作。

npm link 正是为这种情况而生。如官方文档所述:https://docs.npmjs.com/cli/link:

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

假设您拥有此项目:

-- my_module

-- -- index.js
-- -- cli.js
-- -- package.json

而且您有这个 package.json 文件:

{
  "name": "my_module",
  "bin": {
    "my_module": "cli.js"
  },
}

运行:

cd my_module

那么:

npm link

现在npm将在您的计算机中全局安装您的包。它将检查package.json文件中的bin条目,并将my_module链接到cli.js文件。这将通过在全局npm目录中创建符号链接来实现到当前目录。

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

my_module

如果你更改了cli.js的内容,下次运行my_module时会反映出来,同时它将指向cli.js文件。如果你将my_module重命名为my_module2,请使用npm unlink然后再次使用npm link


另外,npm可以使用完整的url作为包名,在下载和安装包时将使用该url而不是查找npm注册表。你可以从自己的私人Git主机安装软件包,例如:

npm install -g https://github.com/Me/my_module

你好Mohannad,使用以下命令是否有效: npm install -g . - chamix
preferGlobal现已被弃用([https://docs.npmjs.com/cli/v6/configuring-npm/package-json#preferglobal]) - Thibault Walterspieler
npm link 对我很有用。还有在 package json 中设置 bin。花了一段时间才找到正确的谷歌搜索关键词来到这里。感谢您分享这个知识。 - PAT-O-MATION
我在使用ng-packagr进行库开发(Angular 12 tbe)时遇到了npm link的问题。我以为这可能与我使用nvm-windows有关,但是在删除它并“正常”安装node后,问题仍然存在。 因此,我想对于使用ng-packagr进行库开发,我们只能使用“npm pack”并从存档中安装 :/ 如果我错了,希望有人能纠正我。 - Michał Knapiński
@MohannadNaj,非常感谢!npm link选项对我的情况非常有效。 - ddsultan
1
由于某种原因,这对我来说不起作用。我按照你的指示进行操作,使用npm ls -g命令,它甚至显示为+-- my_module@0.0.2 -> .\E:\work\my_module,但是当我运行需要"my_module"的JS文件node my_script.js时,仍然出现"Error: Cannot find module 'my_module'"的错误。这可能是什么原因呢?我找到了一篇帖子,发现模块的package.json中的"main"入口指向一个不存在的文件,但在这里并非如此;主文件存在且正确。 - iko79

60

请尝试打包模块并进行安装。

npm pack

然后全局安装它

npm i -g my_module-0.0.1.tgz

请告诉我这是否有效


6
当你在开发时,npm link 对于调试很有用。但一旦经过充分测试,我认为这种解决方案就是合适的。 - aemonge

5

我最近也遇到了同样的问题。 我开发了一个CLI模块,以便能够从任何地方调用它,将其发布到NPM注册表并使用-g选项安装它,但是当从命令行调用它时,我仍然会收到command not found错误。 在package.json文件中添加bin属性是解决问题的关键。

根据NPM文档

许多软件包具有一个或多个可执行文件,它们希望将其安装到PATH中。 npm使这相当容易(实际上,它使用此功能来安装“npm”可执行文件。)

要使用此功能,请在您的package.json中提供一个bin字段,该字段是命令名称与本地文件名的映射。 在安装时,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",
    ...
}

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接