生成节点子进程时不尊重cwd

时间:2018-11-09 08:14:20

标签: node.js

我正在尝试使用Node v11.1.0生成一个同步子进程,并按如下所示设置当前工作目录。我正在使用Windows 10。

const options = {
  cwd: 'D:\\somepath\\node_modules\\.install-npm-version-temp-U9EUNd',
  stdio: 'inherit'
};
const command = process.platform === 'win32' ? 'npm.cmd' : 'npm';
childProcess.spawnSync(command, ['install', 'chalk@2.4.1'], options);

在此示例中,父进程的当前工作目录为'D:\\somepath'

子进程完成执行后,我希望将粉笔@ 2.4.1安装到上面设置的cwd中,但事实并非如此。相反,它安装在'D:\\somepath\\node_modules'中,这使我相信子进程的当前工作目录实际上是父进程的当前工作目录。进一步的证据表明,'D:\\somepath\\package.json'被修改,这是由于子进程正在运行以包含依赖项chalk@2.4.1(之前没有出现)。

请注意,以上cwd路径在我的计算机上有效。 NPM命令执行并报告成功。

基于Node docs,我相信我正确地使用了spawnSync API,但是调试它没有运气。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您在package.json中有一个D:\somepath文件,而不在cwd中。

来自npm docs

  

在本地安装时,npm首先尝试查找适当的前缀文件夹。这样一来,即使您碰巧进入其他文件夹,npm install foo@1.2.3也会安装到软件包的明智根目录。

     

从$ PWD开始,npm将沿着文件夹树走,检查是否包含package.json文件或node_modules文件夹的文件夹。如果找到这样的东西,则出于运行npm命令的目的,将其视为有效的“当前目录”。 (此行为是受git的.git-folder在工作目录中运行git命令时寻求逻辑的启发并相似。)

     

如果未找到软件包根目录,则使用当前文件夹。