我对node和npm相当新,所以想象一下这可能就是我尝试使用它的方式。到目前为止,我的理解和问题如下。
使用npm安装模块时,如果它们具有可执行文件,则会在node_moadules/.bin
例如npm install istanbul
创建
node_moadules/.bin/istanbul.cmd
,内容如下:
@IF EXIST "%~dp0\node.exe" (
"%~dp0\node.exe" "%~dp0\..\istanbul\lib\cli.js" %*
) ELSE (
@SETLOCAL
@SET PATHEXT=%PATHEXT:;.JS;=;%
node "%~dp0\..\istanbul\lib\cli.js" %*
)
对于安装的其他npm模块,这似乎大致相似。
1) bin目录中何时会有一个node.exe(%~dp0
是批处理文件的路径 - 所以node_moadules/.bin
)?当使用npm istanbul
时,它将使用上面的脚本,但我不明白何时使用IF块,它似乎总是进入ELSE,它使用路径上的节点来运行它。当我安装节点并在我的路径上时,这将按预期工作。但是,如果您没有在您的路径上使用它或者需要在项目中使用特定版本(与路径上的版本不同),这似乎是一个问题。
2)我可以通过手动编辑上面的脚本来指向特定的节点版本来解决这个问题,但是不想对所有使用npm安装的模块可执行文件执行此操作。有没有办法在npm中配置它,所以它在生成这些可执行文件时使用节点的特定路径?
多一点背景
我们在构建中使用gradle-node-plugin,因此我们不必在构建计算机上管理节点和npm,这样做对我们而言。但是,这意味着我们没有路径上的节点。
该插件允许我安装npm模块但是没有明确的方法来运行可执行文件,使用插件解压缩的节点版本,而无需手动编辑生成的可执行脚本,如 2),或者不是调用npm istanbul
来调用这样的东西:
<path_to>\node <path_to>\node_modules\istanbul\lib\cli.js
这似乎也不正确,因为我对模块中的cli.js
可执行路径进行了硬编码,这可能会在该模块的未来版本中发生变化。
如果有人能够解释这一点,或者告诉我哪些文档的具体部分会有所帮助。我试图搜索但可能没有使用正确的术语。