diff --git a/packages/bazel/src/builders/bazel.ts b/packages/bazel/src/builders/bazel.ts index a9f143e453..e2dd5cb82f 100644 --- a/packages/bazel/src/builders/bazel.ts +++ b/packages/bazel/src/builders/bazel.ts @@ -10,6 +10,7 @@ import {spawn} from 'child_process'; import {copyFileSync, existsSync, readFileSync, readdirSync, statSync, unlinkSync, writeFileSync} from 'fs'; +import {platform} from 'os'; import {dirname, join, normalize} from 'path'; export type Executable = 'bazel' | 'ibazel'; @@ -133,6 +134,24 @@ function replaceYarnWithNpm(source: string, dest: string) { writeFileSync(dest, destContent); } +/** + * Disable sandbox on Mac OS by setting spawn_strategy in .bazelrc. + * For a hello world (ng new) application, removing the sandbox improves build + * time by almost 40%. + * ng build with sandbox: 22.0 seconds + * ng build without sandbox: 13.3 seconds + */ +function disableSandbox(source: string, dest: string) { + const srcContent = readFileSync(source, 'utf-8'); + const destContent = `${srcContent} +# Disable sandbox on Mac OS for performance reason. +build --spawn_strategy=local +run --spawn_strategy=local +test --spawn_strategy=local +`; + writeFileSync(dest, destContent); +} + /** * Copy Bazel files (WORKSPACE, BUILD.bazel, etc) from the template directory to * the project `root` directory, and return the absolute paths of the files @@ -154,6 +173,8 @@ export function copyBazelFiles(root: string, templateDir: string) { if (!existsSync(dest)) { if (!useYarn && name === 'WORKSPACE') { replaceYarnWithNpm(source, dest); + } else if (platform() === 'darwin' && name === '.bazelrc') { + disableSandbox(source, dest); } else { copyFileSync(source, dest); }