我正在尝试使用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,但是调试它没有运气。有什么建议吗?
答案 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命令时寻求逻辑的启发并相似。)
如果未找到软件包根目录,则使用当前文件夹。