blob: 6a2f19acefde960af5b5d0264fa1b7e1ed2c0ad8 [file]
// Copyright 2023 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:io';
import 'package:args/command_runner.dart';
import 'package:devtools_tool/model.dart';
import 'package:io/io.dart';
import 'package:path/path.dart' as path;
import '../utils.dart';
const _useLocalFlutterFlag = 'use-local-flutter';
const _updatePerfettoFlag = 'update-perfetto';
class BuildReleaseCommand extends Command {
BuildReleaseCommand() {
argParser
..addFlag(
_useLocalFlutterFlag,
negatable: false,
defaultsTo: false,
help:
'Whether to use the Flutter SDK on PATH instead of the Flutter SDK '
'contained in the "tool/flutter-sdk" directory.',
)
..addFlag(
_updatePerfettoFlag,
negatable: false,
defaultsTo: false,
help: 'Whether to update the Perfetto assets before building DevTools.',
);
}
@override
String get name => 'build-release';
@override
String get description => 'Prepares a release build of DevTools.';
@override
Future run() async {
final repo = DevToolsRepo.getInstance();
final processManager = ProcessManager();
final useLocalFlutter = argResults![_useLocalFlutterFlag];
final updatePerfetto = argResults![_updatePerfettoFlag];
final webBuildDir =
Directory(path.join(repo.devtoolsAppDirectoryPath, 'build', 'web'));
if (!useLocalFlutter) {
logStatus('updating tool/flutter-sdk to the latest flutter candidate');
await processManager.runProcess(CliCommand.tool('update-flutter-sdk'));
}
if (updatePerfetto) {
logStatus('updating the bundled Perfetto assets');
await processManager.runProcess(CliCommand.tool('update-perfetto'));
}
logStatus('cleaning project');
if (webBuildDir.existsSync()) {
webBuildDir.deleteSync(recursive: true);
}
await processManager.runProcess(
CliCommand.flutter('clean'),
workingDirectory: repo.devtoolsAppDirectoryPath,
);
logStatus('building DevTools in release mode');
await processManager.runAll(
commands: [
CliCommand.tool('pub-get --only-main'),
CliCommand.flutter(
'build web --web-renderer canvaskit --pwa-strategy=offline-first'
' --release --no-tree-shake-icons',
),
],
workingDirectory: repo.devtoolsAppDirectoryPath,
);
// TODO(kenz): investigate if we need to perform a windows equivalent of
// `chmod` or if we even need to perform `chmod` for linux / mac anymore.
if (!Platform.isWindows) {
final canvaskitDir = Directory(path.join(webBuildDir.path, 'canvaskit'));
for (final file in canvaskitDir.listSync()) {
if (RegExp(r'canvaskit\..*').hasMatch(file.path)) {
await processManager
.runProcess(CliCommand('chmod 0755 ${file.path}'));
}
}
}
}
}