Skip to content

Add Build Batch Mode with Progress Tracking #14

@MtMath

Description

@MtMath

Description

Currently, the library supports executing build methods via UnityEditor.executeMethod(), but lacks a dedicated API for building projects in batch mode with proper progress tracking. Users have to create their own build methods and manually parse the output to understand build progress.

Current Behavior

To build a Unity project, developers must:

  1. Write a custom build method in C# within their Unity project
  2. Execute it via UnityEditor.executeMethod()
  3. Parse the output manually to track progress
  4. Handle all build configuration themselves
// Current approach
await UnityEditor.executeMethod(
  { projectPath: "/path/to/project", editorVersion: "2022.3.15f1" },
  "MyNamespace.MyBuildScript.PerformBuild",
  ["arg1", "arg2"]
);
// No structured build progress information returned

Proposed Solution

Add a dedicated buildProject() method that:

  1. Accepts structured build configuration parameters
  2. Streams build output in real-time
  3. Provides progress tracking and build stage information
  4. Returns structured build results
// Proposed API
const buildProcess = UnityEditor.buildProject({
  projectInfo: { 
    projectPath: "/path/to/project", 
    editorVersion: "2022.3.15f1" 
  },
  buildOptions: {
    targetPlatform: BuildTargetPlatform.WebGL,
    outputPath: "/path/to/build",
    development: false,
    compression: CompressionMethod.LZ4,
    buildOptions: ["CompressWithLz4HC", "StripDebugSymbols"]
  }
});

// Event-based progress tracking
buildProcess.on('progress', (data) => {
  console.log(`Build progress: ${data.stage}, ${data.percent}%`);
  // data.stage could be 'Compilation', 'AssetProcessing', 'SceneBaking', etc.
});

// Or with async iterator
for await (const update of buildProcess.updates()) {
  console.log(`Stage: ${update.stage}, Progress: ${update.progress}%`);
}

// Get final result
const result = await buildProcess.complete();
console.log(`Build completed: ${result.success}, output at: ${result.outputPath}`);

Implementation Approach

  1. Create new data types for build configuration and progress tracking
  2. Modify the command executor to support streaming via execa's stdout/stderr streams
  3. Parse Unity Editor build output to extract stage and progress information
  4. Return a structured object with build results

Benefits

  1. Improved DX: Developers get real-time feedback during builds
  2. Structured Configuration: No need to manually create build scripts
  3. Progress Information: Applications can display accurate progress bars
  4. CI/CD Integration: Better integration with CI/CD pipelines with rich progress information

Technical Considerations

  • The implementation can leverage execa's streaming capabilities
  • Unity's build output follows predictable patterns that can be parsed
  • Standard build targets and options can be exposed as enums
  • Progress parsing would need to support various Unity versions

Related Issue

Metadata

Metadata

Assignees

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions