mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00
[flutter_tools] Reland: supports tree-shake-icons for web builds (#52054)
This commit is contained in:
parent
6ad807e3a0
commit
8872d1d8c4
10
.cirrus.yml
10
.cirrus.yml
@ -184,7 +184,15 @@ task:
|
|||||||
- bash <(curl -s https://codecov.io/bash) -c -f packages/flutter_tools/coverage/lcov.info -F flutter_tool
|
- bash <(curl -s https://codecov.io/bash) -c -f packages/flutter_tools/coverage/lcov.info -F flutter_tool
|
||||||
|
|
||||||
- name: web_integration_tests
|
- name: web_integration_tests
|
||||||
<< : *WEB_SHARD_TEMPLATE
|
only_if: "changesInclude('.cirrus.yml', 'dev/**', 'packages/flutter/**', 'packages/flutter_test/**', 'packages/flutter_tools/**', 'packages/flutter_web_plugins/**', 'bin/internal/**') || $CIRRUS_PR == ''"
|
||||||
|
environment:
|
||||||
|
# As of October 2019, the Web shards needed more than 6G of RAM.
|
||||||
|
CPU: 2
|
||||||
|
MEMORY: 8G
|
||||||
|
CHROME_NO_SANDBOX: true
|
||||||
|
GOLD_SERVICE_ACCOUNT: ENCRYPTED[3afeea5ac7201151c3d0dc9648862f0462b5e4f55dc600ca8b692319622f7c3eda3d577b1b16cc2ef0311b7314c1c095]
|
||||||
|
script:
|
||||||
|
- dart --enable-asserts ./dev/bots/test.dart
|
||||||
|
|
||||||
- name: web_tests-0-linux
|
- name: web_tests-0-linux
|
||||||
<< : *WEB_SHARD_TEMPLATE
|
<< : *WEB_SHARD_TEMPLATE
|
||||||
|
@ -289,7 +289,7 @@ class IconTreeShaker {
|
|||||||
for (final Map<String, dynamic> iconDataMap in consts.constantInstances) {
|
for (final Map<String, dynamic> iconDataMap in consts.constantInstances) {
|
||||||
if ((iconDataMap['fontPackage'] ?? '') is! String || // Null is ok here.
|
if ((iconDataMap['fontPackage'] ?? '') is! String || // Null is ok here.
|
||||||
iconDataMap['fontFamily'] is! String ||
|
iconDataMap['fontFamily'] is! String ||
|
||||||
iconDataMap['codePoint'] is! int) {
|
iconDataMap['codePoint'] is! num) {
|
||||||
throw IconTreeShakerException._(
|
throw IconTreeShakerException._(
|
||||||
'Invalid ConstFinder result. Expected "fontPackage" to be a String, '
|
'Invalid ConstFinder result. Expected "fontPackage" to be a String, '
|
||||||
'"fontFamily" to be a String, and "codePoint" to be an int, '
|
'"fontFamily" to be a String, and "codePoint" to be an int, '
|
||||||
@ -301,7 +301,7 @@ class IconTreeShaker {
|
|||||||
? family
|
? family
|
||||||
: 'packages/$package/$family';
|
: 'packages/$package/$family';
|
||||||
result[key] ??= <int>[];
|
result[key] ??= <int>[];
|
||||||
result[key].add(iconDataMap['codePoint'] as int);
|
result[key].add((iconDataMap['codePoint'] as num).round());
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -156,9 +156,26 @@ class Dart2JSTarget extends Target {
|
|||||||
final BuildMode buildMode = getBuildModeForName(environment.defines[kBuildMode]);
|
final BuildMode buildMode = getBuildModeForName(environment.defines[kBuildMode]);
|
||||||
final String specPath = globals.fs.path.join(globals.artifacts.getArtifactPath(Artifact.flutterWebSdk), 'libraries.json');
|
final String specPath = globals.fs.path.join(globals.artifacts.getArtifactPath(Artifact.flutterWebSdk), 'libraries.json');
|
||||||
final String packageFile = PackageMap.globalPackagesPath;
|
final String packageFile = PackageMap.globalPackagesPath;
|
||||||
|
final File outputKernel = environment.buildDir.childFile('app.dill');
|
||||||
final File outputFile = environment.buildDir.childFile('main.dart.js');
|
final File outputFile = environment.buildDir.childFile('main.dart.js');
|
||||||
|
final List<String> dartDefines = parseDartDefines(environment);
|
||||||
|
|
||||||
final ProcessResult result = await globals.processManager.run(<String>[
|
// Run the dart2js compilation in two stages, so that icon tree shaking can
|
||||||
|
// parse the kernel file for web builds.
|
||||||
|
final ProcessResult kernelResult = await globals.processManager.run(<String>[
|
||||||
|
globals.artifacts.getArtifactPath(Artifact.engineDartBinary),
|
||||||
|
globals.artifacts.getArtifactPath(Artifact.dart2jsSnapshot),
|
||||||
|
'--libraries-spec=$specPath',
|
||||||
|
'-o',
|
||||||
|
outputKernel.path,
|
||||||
|
'--packages=$packageFile',
|
||||||
|
'--cfe-only',
|
||||||
|
environment.buildDir.childFile('main.dart').path,
|
||||||
|
]);
|
||||||
|
if (kernelResult.exitCode != 0) {
|
||||||
|
throw Exception(kernelResult.stdout + kernelResult.stderr);
|
||||||
|
}
|
||||||
|
final ProcessResult javaScriptResult = await globals.processManager.run(<String>[
|
||||||
globals.artifacts.getArtifactPath(Artifact.engineDartBinary),
|
globals.artifacts.getArtifactPath(Artifact.engineDartBinary),
|
||||||
globals.artifacts.getArtifactPath(Artifact.dart2jsSnapshot),
|
globals.artifacts.getArtifactPath(Artifact.dart2jsSnapshot),
|
||||||
'--libraries-spec=$specPath',
|
'--libraries-spec=$specPath',
|
||||||
@ -166,26 +183,25 @@ class Dart2JSTarget extends Target {
|
|||||||
'-$dart2jsOptimization'
|
'-$dart2jsOptimization'
|
||||||
else
|
else
|
||||||
'-O4',
|
'-O4',
|
||||||
if (buildMode == BuildMode.profile)
|
|
||||||
'--no-minify',
|
|
||||||
'-o',
|
|
||||||
outputFile.path,
|
|
||||||
'--packages=$packageFile',
|
|
||||||
if (buildMode == BuildMode.profile)
|
if (buildMode == BuildMode.profile)
|
||||||
'-Ddart.vm.profile=true'
|
'-Ddart.vm.profile=true'
|
||||||
else
|
else
|
||||||
'-Ddart.vm.product=true',
|
'-Ddart.vm.product=true',
|
||||||
|
for (final String dartDefine in dartDefines)
|
||||||
|
'-D$dartDefine',
|
||||||
|
if (buildMode == BuildMode.profile)
|
||||||
|
'--no-minify',
|
||||||
if (csp)
|
if (csp)
|
||||||
'--csp',
|
'--csp',
|
||||||
for (final String dartDefine in parseDartDefines(environment))
|
'-o',
|
||||||
'-D$dartDefine',
|
outputFile.path,
|
||||||
environment.buildDir.childFile('main.dart').path,
|
environment.buildDir.childFile('app.dill').path,
|
||||||
]);
|
]);
|
||||||
if (result.exitCode != 0) {
|
if (javaScriptResult.exitCode != 0) {
|
||||||
throw Exception(result.stdout + result.stderr);
|
throw Exception(javaScriptResult.stdout + javaScriptResult.stderr);
|
||||||
}
|
}
|
||||||
final File dart2jsDeps = environment.buildDir
|
final File dart2jsDeps = environment.buildDir
|
||||||
.childFile('main.dart.js.deps');
|
.childFile('app.dill.deps');
|
||||||
if (!dart2jsDeps.existsSync()) {
|
if (!dart2jsDeps.existsSync()) {
|
||||||
globals.printError('Warning: dart2js did not produced expected deps list at '
|
globals.printError('Warning: dart2js did not produced expected deps list at '
|
||||||
'${dart2jsDeps.path}');
|
'${dart2jsDeps.path}');
|
||||||
@ -197,7 +213,7 @@ class Dart2JSTarget extends Target {
|
|||||||
platform: globals.platform,
|
platform: globals.platform,
|
||||||
);
|
);
|
||||||
final Depfile depfile = depfileService.parseDart2js(
|
final Depfile depfile = depfileService.parseDart2js(
|
||||||
environment.buildDir.childFile('main.dart.js.deps'),
|
environment.buildDir.childFile('app.dill.deps'),
|
||||||
outputFile,
|
outputFile,
|
||||||
);
|
);
|
||||||
depfileService.writeToFile(
|
depfileService.writeToFile(
|
||||||
|
@ -11,6 +11,7 @@ import '../base/logger.dart';
|
|||||||
import '../build_info.dart';
|
import '../build_info.dart';
|
||||||
import '../build_system/build_system.dart';
|
import '../build_system/build_system.dart';
|
||||||
import '../build_system/targets/dart.dart';
|
import '../build_system/targets/dart.dart';
|
||||||
|
import '../build_system/targets/icon_tree_shaker.dart';
|
||||||
import '../build_system/targets/web.dart';
|
import '../build_system/targets/web.dart';
|
||||||
import '../convert.dart';
|
import '../convert.dart';
|
||||||
import '../globals.dart' as globals;
|
import '../globals.dart' as globals;
|
||||||
@ -52,8 +53,7 @@ Future<void> buildWeb(
|
|||||||
kHasWebPlugins: hasWebPlugins.toString(),
|
kHasWebPlugins: hasWebPlugins.toString(),
|
||||||
kDartDefines: jsonEncode(dartDefines),
|
kDartDefines: jsonEncode(dartDefines),
|
||||||
kCspMode: csp.toString(),
|
kCspMode: csp.toString(),
|
||||||
// TODO(dnfield): Enable font subset. We need to get a kernel file to do
|
kIconTreeShakerFlag: buildInfo.treeShakeIcons.toString(),
|
||||||
// that. https://github.com/flutter/flutter/issues/49730
|
|
||||||
},
|
},
|
||||||
));
|
));
|
||||||
if (!result.success) {
|
if (!result.success) {
|
||||||
|
@ -16,35 +16,38 @@ import 'package:process/process.dart';
|
|||||||
import 'package:platform/platform.dart';
|
import 'package:platform/platform.dart';
|
||||||
|
|
||||||
import '../../../src/common.dart';
|
import '../../../src/common.dart';
|
||||||
|
import '../../../src/context.dart';
|
||||||
import '../../../src/mocks.dart';
|
import '../../../src/mocks.dart';
|
||||||
import '../../../src/testbed.dart';
|
import '../../../src/testbed.dart';
|
||||||
|
|
||||||
|
const List<String> kDart2jsLinuxArgs = <String>[
|
||||||
|
'bin/cache/dart-sdk/bin/dart',
|
||||||
|
'bin/cache/dart-sdk/bin/snapshots/dart2js.dart.snapshot',
|
||||||
|
'--libraries-spec=bin/cache/flutter_web_sdk/libraries.json',
|
||||||
|
];
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
Testbed testbed;
|
Testbed testbed;
|
||||||
Environment environment;
|
Environment environment;
|
||||||
MockPlatform mockPlatform;
|
FakeProcessManager processManager;
|
||||||
MockPlatform mockWindowsPlatform;
|
final Platform linux = FakePlatform(
|
||||||
|
operatingSystem: 'linux',
|
||||||
|
environment: <String, String>{},
|
||||||
|
);
|
||||||
|
final Platform windows = FakePlatform(
|
||||||
|
operatingSystem: 'windows',
|
||||||
|
environment: <String, String>{},
|
||||||
|
);
|
||||||
DepfileService depfileService;
|
DepfileService depfileService;
|
||||||
|
|
||||||
setUp(() {
|
setUp(() {
|
||||||
mockPlatform = MockPlatform();
|
|
||||||
mockWindowsPlatform = MockPlatform();
|
|
||||||
|
|
||||||
when(mockPlatform.isWindows).thenReturn(false);
|
|
||||||
when(mockPlatform.isMacOS).thenReturn(true);
|
|
||||||
when(mockPlatform.isLinux).thenReturn(false);
|
|
||||||
when(mockPlatform.environment).thenReturn(const <String, String>{});
|
|
||||||
|
|
||||||
when(mockWindowsPlatform.isWindows).thenReturn(true);
|
|
||||||
when(mockWindowsPlatform.isMacOS).thenReturn(false);
|
|
||||||
when(mockWindowsPlatform.isLinux).thenReturn(false);
|
|
||||||
|
|
||||||
testbed = Testbed(setup: () {
|
testbed = Testbed(setup: () {
|
||||||
final File packagesFile = globals.fs.file(globals.fs.path.join('foo', '.packages'))
|
final File packagesFile = globals.fs.file(globals.fs.path.join('foo', '.packages'))
|
||||||
..createSync(recursive: true)
|
..createSync(recursive: true)
|
||||||
..writeAsStringSync('foo:lib/\n');
|
..writeAsStringSync('foo:lib/\n');
|
||||||
PackageMap.globalPackagesPath = packagesFile.path;
|
PackageMap.globalPackagesPath = packagesFile.path;
|
||||||
globals.fs.currentDirectory.childDirectory('bar').createSync();
|
globals.fs.currentDirectory.childDirectory('bar').createSync();
|
||||||
|
processManager = FakeProcessManager.list(<FakeCommand>[]);
|
||||||
|
|
||||||
environment = Environment.test(
|
environment = Environment.test(
|
||||||
globals.fs.currentDirectory,
|
globals.fs.currentDirectory,
|
||||||
@ -61,7 +64,7 @@ void main() {
|
|||||||
);
|
);
|
||||||
environment.buildDir.createSync(recursive: true);
|
environment.buildDir.createSync(recursive: true);
|
||||||
}, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
Platform: () => mockPlatform,
|
Platform: () => linux,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -156,7 +159,7 @@ void main() {
|
|||||||
// Import.
|
// Import.
|
||||||
expect(generated, contains("import 'package:foo/main.dart' as entrypoint;"));
|
expect(generated, contains("import 'package:foo/main.dart' as entrypoint;"));
|
||||||
}, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
Platform: () => mockWindowsPlatform,
|
Platform: () => windows,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
test('WebEntrypointTarget generates an entrypoint without plugins and init platform', () => testbed.run(() async {
|
test('WebEntrypointTarget generates an entrypoint without plugins and init platform', () => testbed.run(() async {
|
||||||
@ -216,111 +219,131 @@ void main() {
|
|||||||
test('Dart2JSTarget calls dart2js with expected args with csp', () => testbed.run(() async {
|
test('Dart2JSTarget calls dart2js with expected args with csp', () => testbed.run(() async {
|
||||||
environment.defines[kBuildMode] = 'profile';
|
environment.defines[kBuildMode] = 'profile';
|
||||||
environment.defines[kCspMode] = 'true';
|
environment.defines[kCspMode] = 'true';
|
||||||
when(globals.processManager.run(any)).thenAnswer((Invocation invocation) async {
|
processManager.addCommand(FakeCommand(
|
||||||
return FakeProcessResult(exitCode: 0);
|
command: <String>[
|
||||||
});
|
...kDart2jsLinuxArgs,
|
||||||
await const Dart2JSTarget().build(environment);
|
'-o',
|
||||||
|
environment.buildDir.childFile('app.dill').absolute.path,
|
||||||
final List<String> expected = <String>[
|
'--packages=${globals.fs.path.join('foo', '.packages')}',
|
||||||
globals.fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'dart'),
|
'--cfe-only',
|
||||||
globals.fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'snapshots', 'dart2js.dart.snapshot'),
|
environment.buildDir.childFile('main.dart').absolute.path,
|
||||||
'--libraries-spec=' + globals.fs.path.join('bin', 'cache', 'flutter_web_sdk', 'libraries.json'),
|
]
|
||||||
'-O4', // highest optimizations
|
));
|
||||||
'--no-minify', // but uses unminified names for debugging
|
processManager.addCommand(FakeCommand(
|
||||||
|
command: <String>[
|
||||||
|
...kDart2jsLinuxArgs,
|
||||||
|
'-O4',
|
||||||
|
'-Ddart.vm.profile=true',
|
||||||
|
'--no-minify',
|
||||||
|
'--csp',
|
||||||
'-o',
|
'-o',
|
||||||
environment.buildDir.childFile('main.dart.js').absolute.path,
|
environment.buildDir.childFile('main.dart.js').absolute.path,
|
||||||
'--packages=${globals.fs.path.join('foo', '.packages')}',
|
environment.buildDir.childFile('app.dill').absolute.path,
|
||||||
'-Ddart.vm.profile=true',
|
]
|
||||||
'--csp',
|
));
|
||||||
environment.buildDir.childFile('main.dart').absolute.path,
|
|
||||||
];
|
await const Dart2JSTarget().build(environment);
|
||||||
verify(globals.processManager.run(expected)).called(1);
|
|
||||||
}, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
ProcessManager: () => MockProcessManager(),
|
ProcessManager: () => processManager,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
|
||||||
test('Dart2JSTarget calls dart2js with expected args in profile mode', () => testbed.run(() async {
|
test('Dart2JSTarget calls dart2js with expected args in profile mode', () => testbed.run(() async {
|
||||||
environment.defines[kBuildMode] = 'profile';
|
environment.defines[kBuildMode] = 'profile';
|
||||||
when(globals.processManager.run(any)).thenAnswer((Invocation invocation) async {
|
processManager.addCommand(FakeCommand(
|
||||||
return FakeProcessResult(exitCode: 0);
|
command: <String>[
|
||||||
});
|
...kDart2jsLinuxArgs,
|
||||||
await const Dart2JSTarget().build(environment);
|
'-o',
|
||||||
|
environment.buildDir.childFile('app.dill').absolute.path,
|
||||||
final List<String> expected = <String>[
|
'--packages=${globals.fs.path.join('foo', '.packages')}',
|
||||||
globals.fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'dart'),
|
'--cfe-only',
|
||||||
globals.fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'snapshots', 'dart2js.dart.snapshot'),
|
environment.buildDir.childFile('main.dart').absolute.path,
|
||||||
'--libraries-spec=' + globals.fs.path.join('bin', 'cache', 'flutter_web_sdk', 'libraries.json'),
|
]
|
||||||
'-O4', // highest optimizations
|
));
|
||||||
'--no-minify', // but uses unminified names for debugging
|
processManager.addCommand(FakeCommand(
|
||||||
|
command: <String>[
|
||||||
|
...kDart2jsLinuxArgs,
|
||||||
|
'-O4',
|
||||||
|
'-Ddart.vm.profile=true',
|
||||||
|
'--no-minify',
|
||||||
'-o',
|
'-o',
|
||||||
environment.buildDir.childFile('main.dart.js').absolute.path,
|
environment.buildDir.childFile('main.dart.js').absolute.path,
|
||||||
'--packages=${globals.fs.path.join('foo', '.packages')}',
|
environment.buildDir.childFile('app.dill').absolute.path,
|
||||||
'-Ddart.vm.profile=true',
|
]
|
||||||
environment.buildDir.childFile('main.dart').absolute.path,
|
));
|
||||||
];
|
|
||||||
verify(globals.processManager.run(expected)).called(1);
|
await const Dart2JSTarget().build(environment);
|
||||||
}, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
ProcessManager: () => MockProcessManager(),
|
ProcessManager: () => processManager,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
test('Dart2JSTarget calls dart2js with expected args in release mode', () => testbed.run(() async {
|
test('Dart2JSTarget calls dart2js with expected args in release mode', () => testbed.run(() async {
|
||||||
environment.defines[kBuildMode] = 'release';
|
environment.defines[kBuildMode] = 'release';
|
||||||
when(globals.processManager.run(any)).thenAnswer((Invocation invocation) async {
|
processManager.addCommand(FakeCommand(
|
||||||
return FakeProcessResult(exitCode: 0);
|
command: <String>[
|
||||||
});
|
...kDart2jsLinuxArgs,
|
||||||
await const Dart2JSTarget().build(environment);
|
'-o',
|
||||||
|
environment.buildDir.childFile('app.dill').absolute.path,
|
||||||
final List<String> expected = <String>[
|
'--packages=${globals.fs.path.join('foo', '.packages')}',
|
||||||
globals.fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'dart'),
|
'--cfe-only',
|
||||||
globals.fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'snapshots', 'dart2js.dart.snapshot'),
|
environment.buildDir.childFile('main.dart').absolute.path,
|
||||||
'--libraries-spec=' + globals.fs.path.join('bin', 'cache', 'flutter_web_sdk', 'libraries.json'),
|
]
|
||||||
'-O4', // highest optimizations.
|
));
|
||||||
|
processManager.addCommand(FakeCommand(
|
||||||
|
command: <String>[
|
||||||
|
...kDart2jsLinuxArgs,
|
||||||
|
'-O4',
|
||||||
|
'-Ddart.vm.product=true',
|
||||||
'-o',
|
'-o',
|
||||||
environment.buildDir.childFile('main.dart.js').absolute.path,
|
environment.buildDir.childFile('main.dart.js').absolute.path,
|
||||||
'--packages=${globals.fs.path.join('foo', '.packages')}',
|
environment.buildDir.childFile('app.dill').absolute.path,
|
||||||
'-Ddart.vm.product=true',
|
]
|
||||||
environment.buildDir.childFile('main.dart').absolute.path,
|
));
|
||||||
];
|
|
||||||
verify(globals.processManager.run(expected)).called(1);
|
await const Dart2JSTarget().build(environment);
|
||||||
}, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
ProcessManager: () => MockProcessManager(),
|
ProcessManager: () => processManager,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
test('Dart2JSTarget calls dart2js with expected args in release with dart2js optimization override', () => testbed.run(() async {
|
test('Dart2JSTarget calls dart2js with expected args in release with dart2js optimization override', () => testbed.run(() async {
|
||||||
environment.defines[kBuildMode] = 'release';
|
environment.defines[kBuildMode] = 'release';
|
||||||
environment.defines[kDart2jsOptimization] = 'O3';
|
environment.defines[kDart2jsOptimization] = 'O3';
|
||||||
when(globals.processManager.run(any)).thenAnswer((Invocation invocation) async {
|
processManager.addCommand(FakeCommand(
|
||||||
return FakeProcessResult(exitCode: 0);
|
command: <String>[
|
||||||
});
|
...kDart2jsLinuxArgs,
|
||||||
await const Dart2JSTarget().build(environment);
|
'-o',
|
||||||
|
environment.buildDir.childFile('app.dill').absolute.path,
|
||||||
final List<String> expected = <String>[
|
'--packages=${globals.fs.path.join('foo', '.packages')}',
|
||||||
globals.fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'dart'),
|
'--cfe-only',
|
||||||
globals.fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'snapshots', 'dart2js.dart.snapshot'),
|
environment.buildDir.childFile('main.dart').absolute.path,
|
||||||
'--libraries-spec=' + globals.fs.path.join('bin', 'cache', 'flutter_web_sdk', 'libraries.json'),
|
]
|
||||||
'-O3', // configured optimizations.
|
));
|
||||||
|
processManager.addCommand(FakeCommand(
|
||||||
|
command: <String>[
|
||||||
|
...kDart2jsLinuxArgs,
|
||||||
|
'-O3',
|
||||||
|
'-Ddart.vm.product=true',
|
||||||
'-o',
|
'-o',
|
||||||
environment.buildDir.childFile('main.dart.js').absolute.path,
|
environment.buildDir.childFile('main.dart.js').absolute.path,
|
||||||
'--packages=${globals.fs.path.join('foo', '.packages')}',
|
environment.buildDir.childFile('app.dill').absolute.path,
|
||||||
'-Ddart.vm.product=true',
|
]
|
||||||
environment.buildDir.childFile('main.dart').absolute.path,
|
));
|
||||||
];
|
|
||||||
verify(globals.processManager.run(expected)).called(1);
|
await const Dart2JSTarget().build(environment);
|
||||||
}, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
ProcessManager: () => MockProcessManager(),
|
ProcessManager: () => processManager,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
test('Dart2JSTarget produces expected depfile', () => testbed.run(() async {
|
test('Dart2JSTarget produces expected depfile', () => testbed.run(() async {
|
||||||
environment.defines[kBuildMode] = 'release';
|
environment.defines[kBuildMode] = 'release';
|
||||||
when(globals.processManager.run(any)).thenAnswer((Invocation invocation) async {
|
when(globals.processManager.run(any)).thenAnswer((Invocation invocation) async {
|
||||||
environment.buildDir.childFile('main.dart.js.deps')
|
environment.buildDir.childFile('app.dill.deps')
|
||||||
.writeAsStringSync('file:///a.dart');
|
.writeAsStringSync('file:///a.dart');
|
||||||
return FakeProcessResult(exitCode: 0);
|
return FakeProcessResult(exitCode: 0);
|
||||||
});
|
});
|
||||||
await const Dart2JSTarget().build(environment);
|
await const Dart2JSTarget().build(environment);
|
||||||
|
|
||||||
expect(environment.buildDir.childFile('dart2js.d').existsSync(), true);
|
expect(environment.buildDir.childFile('dart2js.d'), exists);
|
||||||
final Depfile depfile = depfileService.parse(environment.buildDir.childFile('dart2js.d'));
|
final Depfile depfile = depfileService.parse(environment.buildDir.childFile('dart2js.d'));
|
||||||
|
|
||||||
expect(depfile.inputs.single.path, globals.fs.path.absolute('a.dart'));
|
expect(depfile.inputs.single.path, globals.fs.path.absolute('a.dart'));
|
||||||
@ -333,54 +356,64 @@ void main() {
|
|||||||
test('Dart2JSTarget calls dart2js with Dart defines in release mode', () => testbed.run(() async {
|
test('Dart2JSTarget calls dart2js with Dart defines in release mode', () => testbed.run(() async {
|
||||||
environment.defines[kBuildMode] = 'release';
|
environment.defines[kBuildMode] = 'release';
|
||||||
environment.defines[kDartDefines] = '["FOO=bar","BAZ=qux"]';
|
environment.defines[kDartDefines] = '["FOO=bar","BAZ=qux"]';
|
||||||
when(globals.processManager.run(any)).thenAnswer((Invocation invocation) async {
|
processManager.addCommand(FakeCommand(
|
||||||
return FakeProcessResult(exitCode: 0);
|
command: <String>[
|
||||||
});
|
...kDart2jsLinuxArgs,
|
||||||
await const Dart2JSTarget().build(environment);
|
|
||||||
|
|
||||||
final List<String> expected = <String>[
|
|
||||||
globals.fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'dart'),
|
|
||||||
globals.fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'snapshots', 'dart2js.dart.snapshot'),
|
|
||||||
'--libraries-spec=' + globals.fs.path.join('bin', 'cache', 'flutter_web_sdk', 'libraries.json'),
|
|
||||||
'-O4',
|
|
||||||
'-o',
|
'-o',
|
||||||
environment.buildDir.childFile('main.dart.js').absolute.path,
|
environment.buildDir.childFile('app.dill').absolute.path,
|
||||||
'--packages=${globals.fs.path.join('foo', '.packages')}',
|
'--packages=${globals.fs.path.join('foo', '.packages')}',
|
||||||
|
'--cfe-only',
|
||||||
|
environment.buildDir.childFile('main.dart').absolute.path,
|
||||||
|
]
|
||||||
|
));
|
||||||
|
processManager.addCommand(FakeCommand(
|
||||||
|
command: <String>[
|
||||||
|
...kDart2jsLinuxArgs,
|
||||||
|
'-O4',
|
||||||
'-Ddart.vm.product=true',
|
'-Ddart.vm.product=true',
|
||||||
'-DFOO=bar',
|
'-DFOO=bar',
|
||||||
'-DBAZ=qux',
|
'-DBAZ=qux',
|
||||||
environment.buildDir.childFile('main.dart').absolute.path,
|
'-o',
|
||||||
];
|
environment.buildDir.childFile('main.dart.js').absolute.path,
|
||||||
verify(globals.processManager.run(expected)).called(1);
|
environment.buildDir.childFile('app.dill').absolute.path,
|
||||||
|
]
|
||||||
|
));
|
||||||
|
|
||||||
|
await const Dart2JSTarget().build(environment);
|
||||||
}, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
ProcessManager: () => MockProcessManager(),
|
ProcessManager: () => processManager,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
test('Dart2JSTarget calls dart2js with Dart defines in profile mode', () => testbed.run(() async {
|
test('Dart2JSTarget calls dart2js with Dart defines in profile mode', () => testbed.run(() async {
|
||||||
environment.defines[kBuildMode] = 'profile';
|
environment.defines[kBuildMode] = 'profile';
|
||||||
environment.defines[kDartDefines] = '["FOO=bar","BAZ=qux"]';
|
environment.defines[kDartDefines] = '["FOO=bar","BAZ=qux"]';
|
||||||
when(globals.processManager.run(any)).thenAnswer((Invocation invocation) async {
|
processManager.addCommand(FakeCommand(
|
||||||
return FakeProcessResult(exitCode: 0);
|
command: <String>[
|
||||||
});
|
...kDart2jsLinuxArgs,
|
||||||
await const Dart2JSTarget().build(environment);
|
|
||||||
|
|
||||||
final List<String> expected = <String>[
|
|
||||||
globals.fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'dart'),
|
|
||||||
globals.fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'snapshots', 'dart2js.dart.snapshot'),
|
|
||||||
'--libraries-spec=' + globals.fs.path.join('bin', 'cache', 'flutter_web_sdk', 'libraries.json'),
|
|
||||||
'-O4',
|
|
||||||
'--no-minify',
|
|
||||||
'-o',
|
'-o',
|
||||||
environment.buildDir.childFile('main.dart.js').absolute.path,
|
environment.buildDir.childFile('app.dill').absolute.path,
|
||||||
'--packages=${globals.fs.path.join('foo', '.packages')}',
|
'--packages=${globals.fs.path.join('foo', '.packages')}',
|
||||||
|
'--cfe-only',
|
||||||
|
environment.buildDir.childFile('main.dart').absolute.path,
|
||||||
|
]
|
||||||
|
));
|
||||||
|
processManager.addCommand(FakeCommand(
|
||||||
|
command: <String>[
|
||||||
|
...kDart2jsLinuxArgs,
|
||||||
|
'-O4',
|
||||||
'-Ddart.vm.profile=true',
|
'-Ddart.vm.profile=true',
|
||||||
'-DFOO=bar',
|
'-DFOO=bar',
|
||||||
'-DBAZ=qux',
|
'-DBAZ=qux',
|
||||||
environment.buildDir.childFile('main.dart').absolute.path,
|
'--no-minify',
|
||||||
];
|
'-o',
|
||||||
verify(globals.processManager.run(expected)).called(1);
|
environment.buildDir.childFile('main.dart.js').absolute.path,
|
||||||
|
environment.buildDir.childFile('app.dill').absolute.path,
|
||||||
|
]
|
||||||
|
));
|
||||||
|
|
||||||
|
await const Dart2JSTarget().build(environment);
|
||||||
}, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
ProcessManager: () => MockProcessManager(),
|
ProcessManager: () => processManager,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
test('Dart2JSTarget throws developer-friendly exception on misformatted DartDefines', () => testbed.run(() async {
|
test('Dart2JSTarget throws developer-friendly exception on misformatted DartDefines', () => testbed.run(() async {
|
||||||
@ -427,4 +460,3 @@ void main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class MockProcessManager extends Mock implements ProcessManager {}
|
class MockProcessManager extends Mock implements ProcessManager {}
|
||||||
class MockPlatform extends Mock implements Platform {}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user