diff --git a/packages/docusaurus/src/commands/build.ts b/packages/docusaurus/src/commands/build.ts index 69a35f758b..72d6130828 100644 --- a/packages/docusaurus/src/commands/build.ts +++ b/packages/docusaurus/src/commands/build.ts @@ -124,7 +124,11 @@ async function buildLocale({ outDir, generatedFilesDir, plugins, - siteConfig: {baseUrl, onBrokenLinks, staticDirectories}, + siteConfig: { + baseUrl, + onBrokenLinks, + staticDirectories: staticDirectoriesOption, + }, routes, } = props; @@ -162,15 +166,30 @@ async function buildLocale({ }, }); - if (staticDirectories.length > 0) { - await Promise.all(staticDirectories.map((dir) => fs.ensureDir(dir))); + // The staticDirectories option can contain empty directories, or non-existent + // directories (e.g. user deleted `static`). Instead of issuing an error, we + // just silently filter them out, because user could have never configured it + // in the first place (the default option should always "work"). + const staticDirectories = ( + await Promise.all( + staticDirectoriesOption.map(async (dir) => { + const staticDir = path.resolve(siteDir, dir); + if ( + (await fs.pathExists(staticDir)) && + (await fs.readdir(staticDir)).length > 0 + ) { + return staticDir; + } + return ''; + }), + ) + ).filter(Boolean); + if (staticDirectories.length > 0) { serverConfig = merge(serverConfig, { plugins: [ new CopyWebpackPlugin({ - patterns: staticDirectories - .map((dir) => path.resolve(siteDir, dir)) - .map((dir) => ({from: dir, to: outDir})), + patterns: staticDirectories.map((dir) => ({from: dir, to: outDir})), }), ], }); diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index 54fbf4d0af..022a36ae3c 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -120,6 +120,9 @@ const config = { staticDirectories: [ 'static', path.join(__dirname, '_dogfooding/_asset-tests'), + // Adding a non-existent static directory. If user deleted `static` without + // specifying `staticDirectories: []`, build should still work + path.join(__dirname, '_dogfooding/non-existent'), ], themes: ['live-codeblock', ...dogfoodingThemeInstances], plugins: [