diff --git a/.changeset/fluffy-fans-sing.md b/.changeset/fluffy-fans-sing.md new file mode 100644 index 0000000000..fd875ee00d --- /dev/null +++ b/.changeset/fluffy-fans-sing.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Add experimental environment variable to enable caching for production builds. diff --git a/packages/cli/src/lib/bundler/bundle.ts b/packages/cli/src/lib/bundler/bundle.ts index 2f23d5cae6..a8967bb250 100644 --- a/packages/cli/src/lib/bundler/bundle.ts +++ b/packages/cli/src/lib/bundler/bundle.ts @@ -42,7 +42,6 @@ export async function buildBundle(options: BuildOptions) { isDev: false, baseUrl: resolveBaseUrl(options.frontendConfig), }); - const compiler = webpack(config); const isCi = yn(process.env.CI, { default: false }); @@ -64,7 +63,7 @@ export async function buildBundle(options: BuildOptions) { ); } - const { stats } = await build(compiler, isCi).catch(error => { + const { stats } = await build(config, isCi).catch(error => { console.log(chalk.red('Failed to compile.\n')); throw new Error(`Failed to compile.\n${error.message || error}`); }); @@ -90,10 +89,10 @@ export async function buildBundle(options: BuildOptions) { ); } -async function build(compiler: webpack.Compiler, isCi: boolean) { +async function build(config: webpack.Configuration, isCi: boolean) { const stats = await new Promise( (resolve, reject) => { - compiler.run((err, buildStats) => { + webpack(config, (err, buildStats) => { if (err) { if (err.message) { const { errors } = formatWebpackMessages({ diff --git a/packages/cli/src/lib/bundler/config.ts b/packages/cli/src/lib/bundler/config.ts index 1974153f02..ce216f5c59 100644 --- a/packages/cli/src/lib/bundler/config.ts +++ b/packages/cli/src/lib/bundler/config.ts @@ -35,6 +35,9 @@ import { paths as cliPaths } from '../../lib/paths'; import { runPlain } from '../run'; import ESLintPlugin from 'eslint-webpack-plugin'; import pickBy from 'lodash/pickBy'; +import yn from 'yn'; + +const BUILD_CACHE_ENV_VAR = 'BACKSTAGE_CLI_EXPERIMENTAL_BUILD_CACHE'; export function resolveBaseUrl(config: Config): URL { const baseUrl = config.getString('app.baseUrl'); @@ -146,6 +149,8 @@ export async function createConfig( require.resolve('react-refresh'), ]; + const withCache = yn(process.env[BUILD_CACHE_ENV_VAR], { default: false }); + return { mode: isDev ? 'development' : 'production', profile: false, @@ -206,6 +211,16 @@ export async function createConfig( : {}), }, plugins, + ...(withCache + ? { + cache: { + type: 'filesystem', + buildDependencies: { + config: [__filename], + }, + }, + } + : {}), }; }