Skip to content

Build Metadata

Access information about the current build.

Methods

getInfo()

Get build information:

javascript
const info = gemshell.build.getInfo();

// Returns:
{
  platform: 'darwin',      // darwin, win32, linux
  arch: 'arm64',           // arm64, x64, ia32
  gemshellVersion: '0.6.0',
  buildNumber: 42,
  timestamp: '2024-01-25T12:00:00.000Z',
  isProduction: true,
  isDevelopment: false
}

getGameConfig()

Get game configuration:

javascript
const config = gemshell.build.getGameConfig();

// Returns:
{
  title: 'My Game',
  appName: 'my-game',
  version: '1.0.0',
  width: 1280,
  height: 720,
  // ... all game settings
}

incrementBuildNumber()

Increment and get build number:

javascript
const buildNum = gemshell.build.incrementBuildNumber();
gemshell.log(`Build #${buildNum}`);

getPaths()

Get build paths:

javascript
const paths = gemshell.build.getPaths();

// Returns:
{
  source: '/path/to/game',           // Original game folder
  output: '/path/to/build/output',   // Final build output
  temp: '/path/to/temp',             // Temporary build folder
  assets: '/path/to/assets'          // Assets being processed
}

Example: Build Banner

javascript
module.exports = {
  name: 'Build Banner',
  version: '1.0.0',
  
  async onModifyAssets(context, settings) {
    const info = gemshell.build.getInfo();
    const config = gemshell.build.getGameConfig();
    
    const banner = `
      /*
       * ${config.title} v${config.version}
       * Build #${info.buildNumber}
       * Built: ${info.timestamp}
       * Platform: ${info.platform}-${info.arch}
       * GemShell: ${info.gemshellVersion}
       */
    `;
    
    // Add banner to main JS file
    const jsFiles = gemshell.glob('*.js');
    if (jsFiles.length > 0) {
      gemshell.transform.prependToFile(jsFiles[0], banner);
    }
  }
};

Example: Platform-Specific Assets

javascript
module.exports = {
  name: 'Platform Assets',
  version: '1.0.0',
  
  async onModifyAssets(context, settings) {
    const info = gemshell.build.getInfo();
    const paths = gemshell.build.getPaths();
    
    // Copy platform-specific files
    const platformDir = `assets/${info.platform}`;
    
    if (gemshell.fs.exists(platformDir)) {
      const files = gemshell.fs.list(platformDir);
      
      for (const file of files) {
        gemshell.fs.copy(
          `${platformDir}/${file}`,
          `assets/${file}`
        );
      }
      
      gemshell.log(`Copied ${files.length} platform-specific assets`);
    }
  }
};

Example: Inject Build Info to Game

javascript
module.exports = {
  name: 'Build Info Injector',
  version: '1.0.0',
  
  async onModifyAssets(context, settings) {
    const info = gemshell.build.getInfo();
    const config = gemshell.build.getGameConfig();
    
    const buildInfo = {
      version: config.version,
      buildNumber: info.buildNumber,
      platform: info.platform,
      arch: info.arch,
      timestamp: info.timestamp,
      gemshell: info.gemshellVersion
    };
    
    // Write as JSON file
    gemshell.fs.writeJson('build-info.json', buildInfo);
    
    // Also inject as global variable
    const script = `<script>window.BUILD_INFO = ${JSON.stringify(buildInfo)};</script>`;
    gemshell.transform.injectIntoHtml(script, 'head');
    
    gemshell.log('Build info injected');
  }
};