diff --git a/build/npm/dirs.js b/build/npm/dirs.js new file mode 100644 index 00000000000..a6e2aec4067 --- /dev/null +++ b/build/npm/dirs.js @@ -0,0 +1,48 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +// Complete list of directories where yarn should be executed to install node modules +exports.dirs = [ + '', + 'build', + 'build/lib/watch', + 'extensions', + 'extensions/configuration-editing', + 'extensions/css-language-features', + 'extensions/css-language-features/server', + 'extensions/debug-auto-launch', + 'extensions/debug-server-ready', + 'extensions/emmet', + 'extensions/extension-editing', + 'extensions/git', + 'extensions/git-ui', + 'extensions/github', + 'extensions/github-authentication', + 'extensions/grunt', + 'extensions/gulp', + 'extensions/html-language-features', + 'extensions/html-language-features/server', + 'extensions/image-preview', + 'extensions/jake', + 'extensions/json-language-features', + 'extensions/json-language-features/server', + 'extensions/markdown-language-features', + 'extensions/merge-conflict', + 'extensions/microsoft-authentication', + 'extensions/npm', + 'extensions/php-language-features', + 'extensions/search-result', + 'extensions/typescript-language-features', + 'extensions/vscode-api-tests', + 'extensions/vscode-colorize-tests', + 'extensions/vscode-custom-editor-tests', + 'extensions/vscode-notebook-tests', + 'extensions/vscode-test-resolver', + 'remote', + 'remote/web', + 'test/automation', + 'test/integration/browser', + 'test/smoke', +]; diff --git a/build/npm/postinstall.js b/build/npm/postinstall.js index 6a4d7a9f717..18ccef884a9 100644 --- a/build/npm/postinstall.js +++ b/build/npm/postinstall.js @@ -6,6 +6,7 @@ const cp = require('child_process'); const path = require('path'); const fs = require('fs'); +const { dirs } = require('./dirs'); const yarn = process.platform === 'win32' ? 'yarn.cmd' : 'yarn'; /** @@ -35,29 +36,39 @@ function yarnInstall(location, opts) { } } -yarnInstall('extensions'); // node modules shared by all extensions +for (let dir of dirs) { -if (!(process.platform === 'win32' && (process.arch === 'arm64' || process.env['npm_config_arch'] === 'arm64'))) { - const env = { ...process.env }; - if (process.env['VSCODE_REMOTE_CC']) { env['CC'] = process.env['VSCODE_REMOTE_CC']; } - if (process.env['VSCODE_REMOTE_CXX']) { env['CXX'] = process.env['VSCODE_REMOTE_CXX']; } - if (process.env['VSCODE_REMOTE_NODE_GYP']) { env['npm_config_node_gyp'] = process.env['VSCODE_REMOTE_NODE_GYP']; } - - yarnInstall('remote', { env }); // node modules used by vscode server - yarnInstall('remote/web'); // node modules used by vscode web -} - -const allExtensionFolders = fs.readdirSync('extensions'); -const extensions = allExtensionFolders.filter(e => { - try { - let packageJSON = JSON.parse(fs.readFileSync(path.join('extensions', e, 'package.json')).toString()); - return packageJSON && (packageJSON.dependencies || packageJSON.devDependencies); - } catch (e) { - return false; + if (dir === '') { + // `yarn` already executed in root + continue; } -}); -extensions.forEach(extension => yarnInstall(`extensions/${extension}`, { ignoreEngines: true })); + if (/^remote/.test(dir) && process.platform === 'win32' && (process.arch === 'arm64' || process.env['npm_config_arch'] === 'arm64')) { + // windows arm: do not execute `yarn` on remote folder + continue; + } + + if (dir === 'build/lib/watch') { + // node modules for watching, specific to host node version, not electron + yarnInstallBuildDependencies(); + continue; + } + + let opts; + + if (dir === 'remote') { + // node modules used by vscode server + const env = { ...process.env }; + if (process.env['VSCODE_REMOTE_CC']) { env['CC'] = process.env['VSCODE_REMOTE_CC']; } + if (process.env['VSCODE_REMOTE_CXX']) { env['CXX'] = process.env['VSCODE_REMOTE_CXX']; } + if (process.env['VSCODE_REMOTE_NODE_GYP']) { env['npm_config_node_gyp'] = process.env['VSCODE_REMOTE_NODE_GYP']; } + opts = { env }; + } else if (/^extensions\//.test(dir)) { + opts = { ignoreEngines: true }; + } + + yarnInstall(dir, opts); +} function yarnInstallBuildDependencies() { // make sure we install the deps of build/lib/watch for the system installed @@ -77,10 +88,4 @@ runtime "${runtime}"`; yarnInstall(watchPath); } -yarnInstall(`build`); // node modules required for build -yarnInstall('test/automation'); // node modules required for smoketest -yarnInstall('test/smoke'); // node modules required for smoketest -yarnInstall('test/integration/browser'); // node modules required for integration -yarnInstallBuildDependencies(); // node modules for watching, specific to host node version, not electron - cp.execSync('git config pull.rebase true'); diff --git a/extensions/css-language-features/package.json b/extensions/css-language-features/package.json index 3a7c2a49058..f905a2b67ec 100644 --- a/extensions/css-language-features/package.json +++ b/extensions/css-language-features/package.json @@ -22,7 +22,6 @@ "compile": "gulp compile-extension:css-language-features-client compile-extension:css-language-features-server", "watch": "gulp watch-extension:css-language-features-client watch-extension:css-language-features-server", "test": "node ../../node_modules/mocha/bin/mocha", - "postinstall": "cd server && yarn install", "install-client-next": "yarn add vscode-languageclient@next" }, "categories": [ diff --git a/extensions/html-language-features/package.json b/extensions/html-language-features/package.json index ec59830eb1a..be84bf07b05 100644 --- a/extensions/html-language-features/package.json +++ b/extensions/html-language-features/package.json @@ -20,7 +20,6 @@ "scripts": { "compile": "npx gulp compile-extension:html-language-features-client compile-extension:html-language-features-server", "watch": "npx gulp watch-extension:html-language-features-client watch-extension:html-language-features-server", - "postinstall": "cd server && yarn install", "install-client-next": "yarn add vscode-languageclient@next" }, "categories": [ diff --git a/extensions/json-language-features/package.json b/extensions/json-language-features/package.json index 61744a22209..c36b2e6a359 100644 --- a/extensions/json-language-features/package.json +++ b/extensions/json-language-features/package.json @@ -20,7 +20,6 @@ "scripts": { "compile": "gulp compile-extension:json-language-features-client compile-extension:json-language-features-server", "watch": "gulp watch-extension:json-language-features-client watch-extension:json-language-features-server", - "postinstall": "cd server && yarn install", "install-client-next": "yarn add vscode-languageclient@next" }, "categories": [