【问题标题】:Install a locally developed npm package globally全局安装本地开发的 npm 包
【发布时间】:2015-02-10 20:12:54
【问题描述】:

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

$> npm install -g ./my_module

没有给我想要的结果,即正在运行

$> my_module

结果

my_module: : command not found

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

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

【问题讨论】:

  • 你能添加你的 package.json 吗?
  • npm list -g 给出了全局安装模块所在的路径。 (checkout) 试着把你的包裹放在那里。
  • 我试过了,没有用。我想我只是将包发布到 npm 并收工
  • 好的,我在 package.json 中缺少“bin”属性。我已经设置好了,我的问题解决了

标签: node.js package npm


【解决方案1】:

请尝试打包模块并安装。

npm pack

然后全局安装

npm i -g my_module-0.0.1.tgz

让我知道这是否有效

【讨论】:

  • npm link 在您想在开发时进行调试时很有用。但是一旦经过全面测试,我认为这个解决方案是合适的。
【解决方案2】:

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

npm link 正是针对这种情况而设计的。如offical documentation中所述:

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

假设你有这个项目:

-- 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 文件。如果你更改了cli.js的内容,下次运行my_module时会反映,如果你将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 是否有效。 ??
  • prefereGlobal 现已弃用 ([docs.npmjs.com/cli/v6/configuring-npm/…)
  • npm 链接对我有用。那并在包json中有bin。我花了一段时间才终于得到正确的谷歌搜索关键字来到达这里。感谢您提供这些知识。
  • 我在使用 ng-packagr 进行库开发(Angular 12 tbe)时遇到了 npm 链接问题。我认为它可能与我使用 nvm-windows 有关,但在删除它并“正常”安装节点后,问题仍然存在。所以我想对于使用 ng-packagr 进行库开发,我们仅限于使用“npm pack”并从存档安装:/ 如果我错了,我希望有人纠正我。
【解决方案3】:

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

来自NPM documentation:

许多软件包都有一个或多个可执行文件,他们希望将它们安装到 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。

【讨论】:

    猜你喜欢
    • 2015-02-07
    • 2023-03-10
    • 2021-04-13
    • 1970-01-01
    • 2017-11-05
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多