如何在 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 拆分到一个单独的包中,我不知道该怎么做。我调查过的选项是:
- 将 CLI 依赖项设置为
devDependencies
。这可以防止在下游项目中安装 chalk
等,但这里的缺点是用户必须 npm install -g
在开发模式下,这意味着即使他们安装了测试框架和 linting 工具永远不会使用它们。
- 将 CLI 作为一个单独的 NodeJS package/module。这里的缺点是它使测试变得困难(因为 CLI 和库经常被同时修改并用于测试新功能),并且想要为库做出贡献的开发人员将不得不通过链接这两个包来解决问题,所以尽管它会起作用,但从工作流程的角度来看不太理想。
- 将 CLI 放在主包内的一个文件夹中,并在其中为 CLI 创建另一个
package.json
,通过 npm install ..
拉入主项目。这一直有效,直到您到达安装点,当您意识到一旦包已发布就无法安装 CLI。 npm install @my/library
只会从项目根目录中的 package.json
安装,没有办法说“哦也把包安装在 cli
子目录中。”
理想情况下我想要的是:
npm install @my/library
- 运行 由希望在其项目中使用该库的开发人员提供。仅将库添加到项目的依赖项中,忽略 CLI 和 CLI 需要的任何依赖项。
npm install -g @my/library
- 运行 由最终用户在其系统上全局安装库和 CLI,包括 CLI 依赖项,并通过 [=15= 添加 CLI 到用户路径] bin
节。
npm install --dev
- 为库做出贡献的开发人员用于安装测试框架,以便他们可以 运行 在提交代码以供包含之前进行单元测试。
- 不必将 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
进程。
有没有什么方法可以在 运行 通过 npm install
时仅安装部分 NodeJS 项目,而在使用 npm install -g
时安装其他功能?
我有一个带有命令行界面的库,但是 CLI 对使用我的库的任何下游项目都没有用。因此,当这些项目拉入我的库时,我不希望它们拉下 chalk
等仅用于 CLI 的依赖项,它们永远不会触及。
但是,如果最终用户决定使用 npm install -g
在他们的系统上全局安装我的库,那么我希望安装 CLI,并通过 package.json
中的 bin
部分,放置在他们的路径,这样他们就可以 运行 像任何其他程序一样。
如果不将 CLI 拆分到一个单独的包中,我不知道该怎么做。我调查过的选项是:
- 将 CLI 依赖项设置为
devDependencies
。这可以防止在下游项目中安装chalk
等,但这里的缺点是用户必须npm install -g
在开发模式下,这意味着即使他们安装了测试框架和 linting 工具永远不会使用它们。 - 将 CLI 作为一个单独的 NodeJS package/module。这里的缺点是它使测试变得困难(因为 CLI 和库经常被同时修改并用于测试新功能),并且想要为库做出贡献的开发人员将不得不通过链接这两个包来解决问题,所以尽管它会起作用,但从工作流程的角度来看不太理想。
- 将 CLI 放在主包内的一个文件夹中,并在其中为 CLI 创建另一个
package.json
,通过npm install ..
拉入主项目。这一直有效,直到您到达安装点,当您意识到一旦包已发布就无法安装 CLI。npm install @my/library
只会从项目根目录中的package.json
安装,没有办法说“哦也把包安装在cli
子目录中。”
理想情况下我想要的是:
npm install @my/library
- 运行 由希望在其项目中使用该库的开发人员提供。仅将库添加到项目的依赖项中,忽略 CLI 和 CLI 需要的任何依赖项。npm install -g @my/library
- 运行 由最终用户在其系统上全局安装库和 CLI,包括 CLI 依赖项,并通过 [=15= 添加 CLI 到用户路径]bin
节。npm install --dev
- 为库做出贡献的开发人员用于安装测试框架,以便他们可以 运行 在提交代码以供包含之前进行单元测试。- 不必将 CLI 拆分到一个单独的项目中。
这可能吗?
Is there some way to install only part of a NodeJS project when run via
npm install
, but to install additional features whennpm 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
进程。