buildMsixPackage function

Future<({String outputPath, String packageRoot})> buildMsixPackage({
  1. required String arch,
  2. required ArtifactPayload payload,
  3. required MsixConfig config,
  4. required MsixIdentity identity,
  5. required String version,
  6. required String repoRoot,
  7. required String outputPath,
  8. required String packageRoot,
})

Builds an MSIX package from a prebuilt executable or directory payload.

Implementation

Future<({String outputPath, String packageRoot})> buildMsixPackage({
  required String arch,
  required ArtifactPayload payload,
  required MsixConfig config,
  required MsixIdentity identity,
  required String version,
  required String repoRoot,
  required String outputPath,
  required String packageRoot,
}) async {
  if (version.contains('-')) {
    throw ShipworldException(
      'Prerelease versions cannot be packaged for MSIX: $version',
    );
  }

  final resolvedPackageRoot = _resolveRepoPath(repoRoot, packageRoot);
  final resolvedOutputPath = _resolveRepoPath(repoRoot, outputPath);

  await _removeDirectory(resolvedPackageRoot);
  await Directory(resolvedPackageRoot).create(recursive: true);
  await Directory(p.dirname(resolvedOutputPath)).create(recursive: true);
  await payload.stage(resolvedPackageRoot);
  await File(p.join(resolvedPackageRoot, 'AppxManifest.xml')).writeAsString(
    buildMsixManifest(
      arch: arch,
      identity: identity,
      version: convertVersionToMsixVersion(version),
      config: config,
    ),
  );
  await _writeMsixAssets(p.join(resolvedPackageRoot, 'Assets'));
  await _createPriFile(resolvedPackageRoot);

  final makeAppxPath = await _findWindowsSdkTool('makeappx');

  await runInherited(makeAppxPath, [
    'pack',
    '/v',
    '/o',
    '/h',
    'SHA256',
    '/d',
    resolvedPackageRoot,
    '/p',
    resolvedOutputPath,
  ], workingDirectory: repoRoot);

  return (outputPath: resolvedOutputPath, packageRoot: resolvedPackageRoot);
}