123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- part of 'build_flowy.dart';
- enum _ScanMode {
- ignore,
- target,
- }
- enum _ModifyMode {
- include,
- exclude,
- }
- class _BuildTool {
- const _BuildTool({
- required this.repositoryRoot,
- required this.appVersion,
- this.arch,
- });
- final String repositoryRoot;
- final String appVersion;
- final String? arch;
- String get projectRoot =>
- [repositoryRoot, 'appflowy_flutter'].join(Platform.pathSeparator);
- File get pubspec =>
- File([projectRoot, 'pubspec.yaml'].join(Platform.pathSeparator));
- Future<String> get _architecture async =>
- await Process.run('uname', ['-m']).then((value) => value.stdout.trim());
- Future<String> get _commandForOS async {
- // Check the operating system and CPU architecture
- final os = Platform.operatingSystem;
- final arch = this.arch ??
- (Platform.isMacOS ? await _architecture : Platform.localHostname);
- // Determine the appropriate command based on the OS and architecture
- if (os == 'windows') {
- return 'cargo make --env APP_VERSION=$appVersion --profile production-windows-x86 appflowy';
- }
- if (os == 'linux') {
- return 'cargo make --env APP_VERSION=$appVersion --profile production-linux-x86_64 appflowy';
- }
- if (os == 'macos') {
- if (arch == 'x86_64') {
- return 'cargo make --env APP_VERSION=$appVersion --profile production-mac-x86_64 appflowy';
- }
- if (arch == 'arm64') {
- return 'cargo make --env APP_VERSION=$appVersion --profile production-mac-arm64 appflowy';
- }
- throw 'Unsupported CPU architecture: $arch';
- }
- throw 'Unsupported operating system: $os';
- }
- /// Scans a file for lines between # BEGIN: EXCLUDE_IN_RELEASE and
- /// END: EXCLUDE_IN_RELEASE. Will add a comment to remove those assets
- /// from the build.
- Future<void> _process_directives(
- File file, {
- required _ModifyMode mode,
- }) async {
- // Read the contents of the file into a list
- var lines = await file.readAsLines();
- // Find the lines between BEGIN: EXCLUDE_IN_RELEASE and END: EXCLUDE_IN_RELEASE
- var scanMode = _ScanMode.ignore;
- for (var i = 0; i < lines.length; i++) {
- var line = lines[i];
- if (line.contains(excludeTagBegin)) {
- scanMode = _ScanMode.target;
- } else if (line.contains(excludeTagEnd)) {
- scanMode = _ScanMode.ignore;
- } else if (scanMode == _ScanMode.target) {
- lines[i] = _modify(line, mode: mode);
- }
- }
- // Write the modified contents back to the file
- await file.writeAsString(lines.join('\n'));
- }
- String _modify(String line, {required _ModifyMode mode}) {
- switch (mode) {
- case _ModifyMode.include:
- return line.split('#').where((element) => element != '#').join();
- case _ModifyMode.exclude:
- return '#$line';
- }
- }
- Future<void> _build() async {
- final cwd = Directory.current;
- Directory.current = repositoryRoot;
- final cmd = await _commandForOS;
- // Run the command using the Process.run() function
- // final build = await Process.run('echo', ['hello'], runInShell: true);
- final build =
- await Process.start(cmd.split(' ')[0], cmd.split(' ').sublist(1));
- await stdout.addStream(build.stdout);
- await stderr.addStream(build.stderr);
- Directory.current = cwd;
- }
- Future<void> run() async {
- final pubspec = this.pubspec;
- await _process_directives(pubspec, mode: _ModifyMode.exclude);
- await _build();
- await _process_directives(pubspec, mode: _ModifyMode.include);
- }
- }
|