2019-11-27 23:04:02 +00:00
|
|
|
// Copyright 2014 The Flutter Authors. All rights reserved.
|
2018-02-14 16:05:05 +00:00
|
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
|
|
// found in the LICENSE file.
|
|
|
|
|
|
|
|
import 'package:args/args.dart';
|
2019-04-30 16:10:04 +00:00
|
|
|
import 'package:flutter_tools/src/asset.dart' hide defaultManifestPath;
|
2018-07-24 23:33:49 +00:00
|
|
|
import 'package:flutter_tools/src/base/context.dart';
|
2018-03-22 06:56:18 +00:00
|
|
|
import 'package:flutter_tools/src/base/file_system.dart' as libfs;
|
|
|
|
import 'package:flutter_tools/src/base/io.dart';
|
|
|
|
import 'package:flutter_tools/src/cache.dart';
|
|
|
|
import 'package:flutter_tools/src/context_runner.dart';
|
|
|
|
import 'package:flutter_tools/src/devfs.dart';
|
2018-04-12 08:12:26 +00:00
|
|
|
import 'package:flutter_tools/src/bundle.dart';
|
2020-01-06 19:04:20 +00:00
|
|
|
import 'package:flutter_tools/src/globals.dart' as globals;
|
2019-07-29 14:24:02 +00:00
|
|
|
import 'package:flutter_tools/src/reporting/reporting.dart';
|
2018-02-14 16:05:05 +00:00
|
|
|
|
|
|
|
const String _kOptionPackages = 'packages';
|
2018-04-12 08:12:26 +00:00
|
|
|
const String _kOptionAsset = 'asset-dir';
|
2018-02-14 16:05:05 +00:00
|
|
|
const String _kOptionManifest = 'manifest';
|
|
|
|
const String _kOptionAssetManifestOut = 'asset-manifest-out';
|
2018-08-13 20:35:51 +00:00
|
|
|
const String _kOptionComponentName = 'component-name';
|
2018-08-02 10:02:32 +00:00
|
|
|
const List<String> _kRequiredOptions = <String>[
|
2018-02-14 16:05:05 +00:00
|
|
|
_kOptionPackages,
|
2018-04-12 08:12:26 +00:00
|
|
|
_kOptionAsset,
|
2018-02-14 16:05:05 +00:00
|
|
|
_kOptionAssetManifestOut,
|
2018-08-21 20:14:17 +00:00
|
|
|
_kOptionComponentName,
|
2018-02-14 16:05:05 +00:00
|
|
|
];
|
|
|
|
|
2018-10-05 05:54:56 +00:00
|
|
|
Future<void> main(List<String> args) {
|
|
|
|
return runInContext<void>(() => run(args), overrides: <Type, Generator>{
|
2018-09-12 06:29:29 +00:00
|
|
|
Usage: () => DisabledUsage(),
|
2018-03-28 17:58:28 +00:00
|
|
|
});
|
2018-02-14 16:05:05 +00:00
|
|
|
}
|
|
|
|
|
2019-05-31 20:17:12 +00:00
|
|
|
Future<void> writeFile(libfs.File outputFile, DevFSContent content) async {
|
2018-02-14 16:05:05 +00:00
|
|
|
outputFile.createSync(recursive: true);
|
2019-05-31 20:17:12 +00:00
|
|
|
final List<int> data = await content.contentsAsBytes();
|
|
|
|
outputFile.writeAsBytesSync(data);
|
2018-02-14 16:05:05 +00:00
|
|
|
}
|
|
|
|
|
2018-10-05 05:54:56 +00:00
|
|
|
Future<void> run(List<String> args) async {
|
2018-09-12 06:29:29 +00:00
|
|
|
final ArgParser parser = ArgParser()
|
2018-02-14 16:05:05 +00:00
|
|
|
..addOption(_kOptionPackages, help: 'The .packages file')
|
2018-04-12 08:12:26 +00:00
|
|
|
..addOption(_kOptionAsset,
|
2018-02-14 16:05:05 +00:00
|
|
|
help: 'The directory where to put temporary files')
|
|
|
|
..addOption(_kOptionManifest, help: 'The manifest file')
|
2018-08-13 20:35:51 +00:00
|
|
|
..addOption(_kOptionAssetManifestOut)
|
|
|
|
..addOption(_kOptionComponentName);
|
2018-02-14 16:05:05 +00:00
|
|
|
final ArgResults argResults = parser.parse(args);
|
|
|
|
if (_kRequiredOptions
|
|
|
|
.any((String option) => !argResults.options.contains(option))) {
|
2020-01-06 19:04:20 +00:00
|
|
|
globals.printError('Missing option! All options must be specified.');
|
2018-02-14 16:05:05 +00:00
|
|
|
exit(1);
|
|
|
|
}
|
2020-01-06 19:04:20 +00:00
|
|
|
Cache.flutterRoot = globals.platform.environment['FLUTTER_ROOT'];
|
2018-02-14 16:05:05 +00:00
|
|
|
|
2019-11-19 06:57:42 +00:00
|
|
|
final String assetDir = argResults[_kOptionAsset] as String;
|
2018-02-14 16:05:05 +00:00
|
|
|
final AssetBundle assets = await buildAssets(
|
2019-11-19 06:57:42 +00:00
|
|
|
manifestPath: argResults[_kOptionManifest] as String ?? defaultManifestPath,
|
2018-04-12 08:12:26 +00:00
|
|
|
assetDirPath: assetDir,
|
2019-11-19 06:57:42 +00:00
|
|
|
packagesPath: argResults[_kOptionPackages] as String,
|
2018-02-14 16:05:05 +00:00
|
|
|
);
|
|
|
|
|
|
|
|
if (assets == null) {
|
|
|
|
print('Unable to find assets.');
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
2019-05-31 20:17:12 +00:00
|
|
|
final List<Future<void>> calls = <Future<void>>[];
|
2018-02-14 16:05:05 +00:00
|
|
|
assets.entries.forEach((String fileName, DevFSContent content) {
|
2020-01-06 19:04:20 +00:00
|
|
|
final libfs.File outputFile = globals.fs.file(globals.fs.path.join(assetDir, fileName));
|
2019-05-31 20:17:12 +00:00
|
|
|
calls.add(writeFile(outputFile, content));
|
2018-02-14 16:05:05 +00:00
|
|
|
});
|
2019-05-31 20:17:12 +00:00
|
|
|
await Future.wait<void>(calls);
|
2018-02-14 16:05:05 +00:00
|
|
|
|
2019-11-19 06:57:42 +00:00
|
|
|
final String outputMan = argResults[_kOptionAssetManifestOut] as String;
|
|
|
|
await writeFuchsiaManifest(assets, argResults[_kOptionAsset] as String, outputMan, argResults[_kOptionComponentName] as String);
|
2018-02-14 16:05:05 +00:00
|
|
|
}
|
|
|
|
|
2018-10-05 05:54:56 +00:00
|
|
|
Future<void> writeFuchsiaManifest(AssetBundle assets, String outputBase, String fileDest, String componentName) async {
|
2018-02-14 16:05:05 +00:00
|
|
|
|
2020-01-06 19:04:20 +00:00
|
|
|
final libfs.File destFile = globals.fs.file(fileDest);
|
2018-02-14 16:05:05 +00:00
|
|
|
await destFile.create(recursive: true);
|
|
|
|
final libfs.IOSink outFile = destFile.openWrite();
|
|
|
|
|
2020-01-07 15:32:04 +00:00
|
|
|
for (final String path in assets.entries.keys) {
|
2018-08-21 20:14:17 +00:00
|
|
|
outFile.write('data/$componentName/$path=$outputBase/$path\n');
|
2018-02-14 16:05:05 +00:00
|
|
|
}
|
|
|
|
await outFile.flush();
|
|
|
|
await outFile.close();
|
|
|
|
}
|