由 `npm config set msvs_version 2015 --global` 设置的标志未被 electron-rebuild 接受

Flag set by `npm config set msvs_version 2015 --global` is not being honored by electron-rebuild

问题:

我最初在从 VS 2013 升级到 VS 2015 后构建我的应用程序时遇到问题,但通过设置 msvs_version 2015 解决了该问题。虽然这适用于 npm install(及其节点编译),但它在 electron-rebuild 阶段被忽略了。

详情:

初刊

具体来说,我的构建过程曾经有过这个问题(当我第一次升级时): 22:07:39 c:\work-projects\my-application>c:\CM\elevated_cmd.exe /C "npm install > npm_install.log"<br> 22:22:38 22:22:38 c:\work-projects\my-application>输入 npm_install.log 22:22:38 22:22:38 > libxmljs-mt@0.16.1 安装 c:\work-projects\my-application\node_modules\libxmljs-mt 22:22:38 > node-gyp 重建 22:22:38 22:22:38 22:22:38 c:\work-projects\my-application\node_modules\libxmljs-mt>if not defined npm_config_node_gyp (node "C:\Program Files\nodejs\node_modules\npm\bin\node-gyp-bin\..\..\node_modules\node-gyp\bin\node-gyp.js" rebuild ) else (node "" rebuild ) 22:22:38 一次构建此解决方案中的项目。要启用并行构建,请添加“/m”开关。 22:22:38 C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.Cpp.Platform.targets(57,5):错误 MSB8020:v120 的构建工具(平台工具集 = 'v120') 找不到。要使用 v120 构建工具构建,请安装 v120 构建工具。或者,您可以升级到当前的 Visual Studio 工具,方法是选择“项目”菜单或右键单击解决方案,然后选择 "Retarget solution"。 [c:\work-projects\my-application\node_modules\libxmljs-mt\build\xmljs.vcxproj]

初步解决方案

但是这个命令设置很快就解决了这个问题: npm config set msvs_version 2015 --global

当前问题

一旦我设置了上面的命令,一切似乎都运行良好。 (在 npm install 期间发生的初始编译开始工作正常)。但是一旦我到达使用 electron-rebuild 的构建部分,我发现返回了相同的错误,但仅在 electron-rebuild 编译期间,如下所示: 13:15:32 c:\work-projects\my-application>c:\CM\elevated_cmd.exe /C "gulp erebuild > erebuild.log"<br> 13:16:05 13:16:05 c:\work-projects\my-application>输入 erebuild.log 13:16:05 [13:15:41] 使用 gulp 文件 c:\work-projects\my-application\gulpfile.js 13:16:05 [13:15:41] 开始 'erebuild'... 13:16:05 [13:15:41] 394 毫秒后完成 'erebuild' 13:16:05 [13:16:04] 针对 Electron 重建模块无效:错误:gyp 信息如果以 ok 结尾则有效 13:16:05 使用 node-gyp@3.6.2 的 gyp 信息 13:16:05 使用 node@7.10.1 的 gyp 信息 | Win32 | x64 13:16:05 gyp http GET https://atom.io/download/electron/v1.8.2-beta.4/iojs-v1.8.2-beta.4.tar.gz 13:16:05 gyp http 200 https://atom.io/download/electron/v1.8.2-beta.4/iojs-v1.8.2-beta.4.tar.gz 13:16:05 gyp http GET https://atom.io/download/electron/v1.8.2-beta.4/SHASUMS256.txt 13:16:05 gyp http GET https://atom.io/download/electron/v1.8.2-beta.4/win-x64/iojs.lib 13:16:05 gyp http GET https://atom.io/download/electron/v1.8.2-beta.4/win-x86/iojs.lib 13:16:05 gyp http 200 https://atom.io/download/electron/v1.8.2-beta.4/win-x64/iojs.lib 13:16:05 gyp http 200 https://atom.io/download/electron/v1.8.2-beta.4/SHASUMS256.txt 13:16:05 gyp http 200 https://atom.io/download/electron/v1.8.2-beta.4/win-x86/iojs.lib 13:16:05 gyp 信息生成 C:\Python27\python.exe 13:16:05 gyp 信息生成参数 ['c:\work-projects\my-application\node_modules\node-gyp\gyp\gyp_main.py', 13:16:05 gyp 信息生成参数 'binding.gyp', 13:16:05 gyp 信息生成参数 '-f', 13:16:05 gyp 信息生成参数 'msvs', 13:16:05 gyp 信息生成参数 '-G', 13:16:05 gyp 信息生成参数 'msvs_version=auto', 13:16:05 gyp 信息生成参数 '-I', 13:16:05 gyp 信息生成参数 'c:\work-projects\my-application\node_modules\libxml-xsd\build\config.gypi', 13:16:05 gyp 信息生成参数 '-I', 13:16:05 gyp 信息生成参数 'c:\work-projects\my-application\node_modules\libxml-xsd\common.gypi', 13:16:05 gyp 信息生成参数 '-I', 13:16:05 gyp 信息生成参数 'c:\work-projects\my-application\node_modules\node-gyp\addon.gypi', 13:16:05 gyp 信息生成参数 '-I', 13:16:05 gyp 信息生成参数 'C:\Users\MyBuilderUser\.electron-gyp\.node-gyp\iojs-1.8.2-beta.4\common.gypi', 13:16:05 gyp 信息生成参数 '-Dlibrary=shared_library', 13:16:05 gyp info spawn args '-Dvisibility=default', 13:16:05 gyp 信息生成参数 '-Dnode_root_dir=C:\\Users\\MyBuilderUser\\.electron-gyp\\.node-gyp\\iojs-1.8.2-beta.4', 13:16:05 gyp 信息生成参数 '-Dnode_gyp_dir=c:\\work-projects\\my-application\\node_modules\\node-gyp', 13:16:05 gyp 信息生成参数 '-Dnode_lib_file=C:\\Users\\MyBuilderUser\\.electron-gyp\\.node-gyp\\iojs-1.8.2-beta.4\\< (target_arch)\\iojs.lib', 13:16:05 gyp info spawn args '-Dmodule_root_dir=c:\\work-projects\\my-application\\node_modules\\libxml-xsd', 13:16:05 gyp 信息生成参数 '-Dnode_engine=v8', 13:16:05 gyp 信息生成参数 '--depth=.', 13:16:05 gyp info spawn args '--no-parallel', 13:16:05 gyp info spawn args '--generator-output', 13:16:05 gyp 信息生成参数 'c:\work-projects\my-application\node_modules\libxml-xsd\build', 13:16:05 gyp 信息 spawn args '-Goutput_dir=.' ] 13:16:05 gyp 信息生成 C:\Program Files (x86)\MSBuild.0\bin\msbuild.exe 13:16:05 gyp 信息生成参数 ['build/binding.sln', 13:16:05 gyp info spawn args '/clp:Verbosity=minimal', 13:16:05 gyp 信息 spawn args '/nologo', 13:16:05 gyp 信息 spawn args '/p:Configuration=Release;Platform=x64'] 13:16:05 一次构建此解决方案中的项目。要启用并行构建,请添加“/m”开关。 13:16:05 C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.Cpp.Platform.targets(57,5):错误 MSB8020:v120 的构建工具(平台工具集 = 'v120') 找不到。要使用 v120 构建工具构建,请安装 v120 构建工具。或者,您可以升级到当前的 Visual Studio 工具,方法是选择“项目”菜单或右键单击解决方案,然后选择 "Retarget solution"。 [c:\work-projects\my-application\node_modules\libxml-xsd\build\node-libxml-xsd.vcxproj] 13:16:05 gyp 错误!构建错误 13:16:05 gyp 错误!堆栈错误:`C:\Program Files (x86)\MSBuild.0\bin\msbuild.exe` 失败,退出代码:1 13:16:05 gyp 错误!堆栈在 ChildProcess.onExit (c:\work-projects\my-application\node_modules\node-gyp\lib\build.js:258:23) 13:16:05 gyp 错误!堆栈在 emitTwo (events.js:106:13) 13:16:05 gyp 错误!堆叠在 ChildProcess.emit (events.js:194:7) 13:16:05 gyp 错误!堆叠在 Process.ChildProcess._handle.onexit (internal/child_process.js:215:12) 13:16:05 gyp 错误!系统 Windows_NT 6.3.9600 13:16:05 gyp 错误!命令 "C:\Program Files\nodejs\node.exe" "c:\work-projects\my-application\node_modules\node-gyp\bin\node-gyp.js" "rebuild" "--target=1.8.2-beta.4" "--arch=x64" "--dist-url=https:/ /atom.io/download/electron" "--build-from-source" 13:16:05 gyp 错误! cwd c:\work-projects\my-application\node_modules\libxml-xsd 13:16:05 gyp 错误!节点-v v7.10.1 13:16:05 gyp 错误!节点 gyp -v v3.6.2 13:16:05 gyp 错误!不好 13:16:05 13:16:05 退出代码失败:1

相关代码

我的 gulp electron-rebuild 调用非常简单明了,所以我怀疑它会揭示很多东西,但在这里:
```

gulp.task('erebuild', , function () {
    var eRebuild = require('electron-rebuild').rebuild;
    var arch = process.arch;
    eRebuild(
        {buildPath: __dirname,
            electronVersion: electronVersion,
            arch: arch
        })
        .then(function () {
            log('electron version: ' + electronVersion +  ' arch version: ' + arch);
            log('Electron Rebuild Successful');
            return true;
        }).catch(function (e) {
            log('Rebuilding modules against Electron didn\'t work: ' + e);
        });
});

```

有没有我应该添加到我的 electron-rebuild 调用中以强制为其赋予 msvs_version 值的选项?

electron-rebuild 不应该像 npm install 那样自动使用这个值吗?

我注意到在 gyp 配置参数的 electron-rebuild 显示中,msvs_version=auto 显示为它的设置而不是 2015(请参阅 [=79 中向下的大约 1/3 =] 部分)。如何分配 auto 指向 2015 的值 of/or(或者如何让 electron-rebuild 明确使用 2015 而不是 auto)?我不完全确定应该如何处理。这是 electron-rebuild 中的错误吗? electron-rebuild 应该有一个选项来指定 msvs_version 吗?或者 auto 应该是我在配置中某处设置的值?如果有怎么办?

最终,这种情况无法通过尝试让 electron-rebuild 以某种方式查看 npm msvs_version 设置的配置来解决。在我的情况下,MS Visual Studio 2015 和 2017 的工具集都是在此过程中安装的,似乎这个 install/uninstall 过程中的某些问题导致了问题。

我为解决这个问题所做的是:

  1. 首先,我卸载了所有版本的MSBuild工具,MS Visual Studio (2015 年和 2017 年,就我而言)甚至 Python.

  2. 然后我遵循 "Windows" 中的 "Option 1" 具体说明 https://www.npmjs.com/package/node-gyp#installation 通过执行 npm install --global --production windows-build-tools

  3. 因为所有的 VS、MSBuild 工具和 Python 都被重新安装了 windows-build-tools 包安装,Python 设置似乎 略有残缺。为了解决这个问题,我做了以下事情:

    a) 配置节点以查看 Python (运行 npm config set python "C:\Users\MyUser\.windows-build-tools\python27\python.exe")

    b) 设置 PYTHON 环境变量。您可以使用控制面板或在提升的 CMD 上执行此操作,您可以 运行

    set PYTHON "C:\Users\MyUser\.windows-build-tools\python27\python.exe"

在那之后,一切正常。