如何在 npm install 被赋予 `-g` 标志时安装额外的 bin 文件?

How to install extra bin files when `npm install` is given `-g` flag?

有没有什么方法可以在 运行 通过 npm install 时仅安装部分 NodeJS 项目,而在使用 npm install -g 时安装其他功能?

我有一个带有命令行界面的库,但是 CLI 对使用我的库的任何下游项目都没有用。因此,当这些项目拉入我的库时,我不希望它们拉下 chalk 等仅用于 CLI 的依赖项,它们永远不会触及。

但是,如果最终用户决定使用 npm install -g 在他们的系统上全局安装我的库,那么我希望安装 CLI,并通过 package.json 中的 bin 部分,放置在他们的路径,这样他们就可以 运行 像任何其他程序一样。

如果不将 CLI 拆分到一个单独的包中,我不知道该怎么做。我调查过的选项是:

理想情况下我想要的是:

这可能吗?

Is there some way to install only part of a NodeJS project when run via npm install, but to install additional features when npm install -g is used?

你可以写一个postinstall script that uses is-globally-installed(或另一个类似的包)来检查模块是否全局安装,然后运行任何适合安装CLI的东西(也许npm install -g对于只有 CLI 的单独包)。

好吧,我想出了一个解决方法。

我将 CLI 恢复为仅限开发(其要求在 devDependencies 中,因此本地开发人员可以使用它,但他们不会被拉入使用该库的下游项目)。然后我为 CLI 创建了另一个包,但它只是一个 package.json 文件,没有别的。

这个包的作用是依赖于主库,加上 CLI 需要的依赖。然后它使用 bin 部分指向主库中的 CLI ,因此此包中不需要任何代码 - 它实际上只是一个文件。像这样:

{
  "name": "@my/library-cli",  // new module to install the CLI
  "bin": {
    "myprog": "./node_modules/@my/library/bin/myprog.js"  // the command is inside the dependency
  },
  "dependencies": {
    "@my/library": "*",       // require the library itself where the CLI code sits
    "command-line-args": "*"  // dependency needed by the CLI
  }
}

唯一的缺点是这个新包的 dependencies 需要与主库的 devDependencies 保持同步(至少是 CLI 所需的 deps),但因为它们不会'我的情况不会经常改变,我可以接受。

我确实按照@Trott 的建议尝试了安装后挂钩,但它似乎没有用:

"scripts": {
  "postinstall": "[ $npm_config_global == 'true' ] && (cd cli && npm install -g)"
}

由于某种原因,它的速度非常慢,而且似乎陷入了一个循环,一遍又一遍地尝试安装,但都失败了。我也不确定它是否会通过 npm install -g --prefix /my/install/folder 这样的命令启动,因为非标准前缀可能不会传递给子 npm 进程。