Skip to content

monorepo 下的构建错误及可能的解决方法 #428

@unanmed

Description

@unanmed

#302 中提到了在 monorepo 下打包错误的问题,这里我提供一个取巧的解决办法。

产生这个问题的核心原因是外部库被剔除,导致无法被打包进去,因此我尝试了将 strictOutput 设为 false,虽然可行,但是这导致插件会在根目录下产生一堆临时的 dts 文件及文件夹,例如对于下列目录:

- packages
  - packageA
  - packageB

我们对 packageA 打包,那么会在根目录下产生 packageB 文件夹:

- packages
- packageB

最终打包完成后,packageB 将会是一个只包含空文件夹的文件夹。我想这应该是一个 bug,这些 dts 文件应该生成在对应的 packages/packageB 文件夹中,但是却生成到了根目录。所以我想如果把这个问题修复了,那么 monorepo 下打包就可以使用 strictOutput: false 来实现。

这是我的完整构建脚本可供参考:

for (const packageName of packageDirs) {
    const packageDir = path.join(packages, packageName);
    const output = path.join(packageDir, 'dist');
    await fs.emptyDir(output);
    const configFile = path.resolve('./vite.config.ts');
    const config = await loadConfigFromFile(
        { command: 'build', mode: 'production' },
        configFile
    );
    const resolved = mergeConfig(config?.config ?? {}, {
        plugins: [
            dts({
                insertTypesEntry: true,
                entryRoot: path.join(packageDir, 'src/index.ts'),
                rollupTypes: true,
                strictOutput: false,
                copyDtsFiles: false,
            })
        ],
        build: {
            lib: {
                entry: path.join(packageDir, 'src/index.ts'),
                name: packageName,
                formats: ['es', 'cjs'],
                fileName: format => `${packageName}.${format}.js`
            },
            outDir: output,
            sourcemap: true,
            emptyOutDir: true,
        },
        publicDir: false
    } satisfies UserConfig);

    await build(resolved);
    console.log(`✅ Package ${packageName} built successfully.`);
}

// 最后把错误在根目录生成的文件夹删除
const dirs = await fs.readdir(packages);
for (const name of dirs) {
    const dir = path.join(process.cwd(), name);
    await fs.emptyDir(dir);
    await fs.rmdir(dir);
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions