fuchsia_asset_builder.dart 3.5 KB
Newer Older
1 2 3 4 5 6 7
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:async';

import 'package:args/args.dart';
8
import 'package:flutter_tools/src/asset.dart' hide defaultManifestPath;
9
import 'package:flutter_tools/src/base/context.dart';
10 11 12 13 14 15
import 'package:flutter_tools/src/base/file_system.dart' as libfs;
import 'package:flutter_tools/src/base/io.dart';
import 'package:flutter_tools/src/base/platform.dart';
import 'package:flutter_tools/src/cache.dart';
import 'package:flutter_tools/src/context_runner.dart';
import 'package:flutter_tools/src/devfs.dart';
16
import 'package:flutter_tools/src/disabled_usage.dart';
17
import 'package:flutter_tools/src/bundle.dart';
18
import 'package:flutter_tools/src/globals.dart';
19
import 'package:flutter_tools/src/usage.dart';
20 21

const String _kOptionPackages = 'packages';
22
const String _kOptionAsset = 'asset-dir';
23 24
const String _kOptionManifest = 'manifest';
const String _kOptionAssetManifestOut = 'asset-manifest-out';
25
const String _kOptionComponentName = 'component-name';
26
const List<String> _kRequiredOptions = <String>[
27
  _kOptionPackages,
28
  _kOptionAsset,
29
  _kOptionAssetManifestOut,
30
  _kOptionComponentName,
31 32
];

33 34
Future<void> main(List<String> args) {
  return runInContext<void>(() => run(args), overrides: <Type, Generator>{
35
    Usage: () => DisabledUsage(),
36
  });
37 38
}

39
Future<void> writeFile(libfs.File outputFile, DevFSContent content) async {
40
  outputFile.createSync(recursive: true);
41 42
  final List<int> data = await content.contentsAsBytes();
  outputFile.writeAsBytesSync(data);
43 44
}

45
Future<void> run(List<String> args) async {
46
  final ArgParser parser = ArgParser()
47
    ..addOption(_kOptionPackages, help: 'The .packages file')
48
    ..addOption(_kOptionAsset,
49 50
        help: 'The directory where to put temporary files')
    ..addOption(_kOptionManifest, help: 'The manifest file')
51 52
    ..addOption(_kOptionAssetManifestOut)
    ..addOption(_kOptionComponentName);
53 54 55 56 57 58 59 60
  final ArgResults argResults = parser.parse(args);
  if (_kRequiredOptions
      .any((String option) => !argResults.options.contains(option))) {
    printError('Missing option! All options must be specified.');
    exit(1);
  }
  Cache.flutterRoot = platform.environment['FLUTTER_ROOT'];

61
  final String assetDir = argResults[_kOptionAsset];
62 63
  final AssetBundle assets = await buildAssets(
    manifestPath: argResults[_kOptionManifest] ?? defaultManifestPath,
64
    assetDirPath: assetDir,
65 66 67 68 69 70 71 72 73
    packagesPath: argResults[_kOptionPackages],
    includeDefaultFonts: false,
  );

  if (assets == null) {
    print('Unable to find assets.');
    exit(1);
  }

74
  final List<Future<void>> calls = <Future<void>>[];
75
  assets.entries.forEach((String fileName, DevFSContent content) {
76
    final libfs.File outputFile = libfs.fs.file(libfs.fs.path.join(assetDir, fileName));
77
    calls.add(writeFile(outputFile, content));
78
  });
79
  await Future.wait<void>(calls);
80 81

  final String outputMan = argResults[_kOptionAssetManifestOut];
82
  await writeFuchsiaManifest(assets, argResults[_kOptionAsset], outputMan, argResults[_kOptionComponentName]);
83 84
}

85
Future<void> writeFuchsiaManifest(AssetBundle assets, String outputBase, String fileDest, String componentName) async {
86 87 88 89 90 91

  final libfs.File destFile = libfs.fs.file(fileDest);
  await destFile.create(recursive: true);
  final libfs.IOSink outFile = destFile.openWrite();

  for (String path in assets.entries.keys) {
92
    outFile.write('data/$componentName/$path=$outputBase/$path\n');
93 94 95 96
  }
  await outFile.flush();
  await outFile.close();
}