From 0c5427db9c42475e5e9357b19f1715abef80ccb8 Mon Sep 17 00:00:00 2001 From: Raymond Zhao Date: Fri, 15 Jan 2021 15:30:30 -0800 Subject: [PATCH] Fix #111299 --- build/npm/preinstall.js | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/build/npm/preinstall.js b/build/npm/preinstall.js index 94dbb3b9e0d..1e7d0cc869a 100644 --- a/build/npm/preinstall.js +++ b/build/npm/preinstall.js @@ -28,7 +28,47 @@ if (!/yarn[\w-.]*\.js$|yarnpkg$/.test(process.env['npm_execpath'])) { err = true; } +const os = process.env['OS']; +if (os.startsWith('Windows')) { + const vsVersion = getLatestSupportedVisualStudioVersion(); + if (!vsVersion) { + console.error('\033[1;31m*** Please use Visual Studio 2017 or 2019.\033[0;0m'); + err = true; + } +} + if (err) { console.error(''); process.exit(1); } + +function getLatestSupportedVisualStudioVersion() { + const fs = require('fs'); + const path = require('path'); + // Translated over from + // https://source.chromium.org/chromium/chromium/src/+/master:build/vs_toolchain.py;l=140-175 + const supportedVersions = ['2019', '2017']; + + // VS installed in depot_tools for Googlers + if (process.env['DEPOT_TOOLS_WIN_TOOLCHAIN'] === '1') { + return supportedVersions[0]; + } + + // VS installed in system for everyone else + const availableVersions = []; + for (const version of supportedVersions) { + let vsPath = process.env[`vs${version}_install`]; + if (vsPath && fs.existsSync(vsPath)) { + availableVersions.push(version); + break; + } + const programFiles86Path = process.env['ProgramFiles(x86)']; + vsPath = `${programFiles86Path}/Microsoft Visual Studio/${version}`; + const vsTypes = ['Enterprise', 'Professional', 'Community', 'Preview', 'BuildTools']; + if (programFiles86Path && vsTypes.some(vsType => fs.existsSync(path.join(vsPath, vsType)))) { + availableVersions.push(version); + break; + } + } + return availableVersions.length ? availableVersions[0] : undefined; +} -- GitLab