// ignore_for_file: avoid_print import 'dart:io'; void main() async { Directory.current = Directory(Platform.script.toFilePath()).parent.parent; final flutterExecutable = Platform.isWindows ? 'flutter.bat' : 'flutter'; print("Build script for Ollama App by JHubi1"); print("Report issues at: https://github.com/JHubi1/ollama-app/issues"); print('----------'); print('Extracting version from pubspec.yaml ...'); final pubspec = File('pubspec.yaml'); final versionLine = await pubspec.readAsLines().then( (lines) => lines.firstWhere((line) => line.contains('version')), ); final version = versionLine.split(':').last.trim().split('+').first.trim(); final versionCode = versionLine.split(':').last.trim().split('+')[1].trim(); print( "Building Ollama App v$version (build $versionCode) - this may take a while", ); print('----------'); await execute('Android', flutterExecutable, [ 'build', 'apk', '--obfuscate', '--split-debug-info=build\\debugAndroid', ]); // ---------- // await execute('Windows x64', flutterExecutable, [ // 'build', // 'windows', // '--obfuscate', // '--split-debug-info=build\\debugWindows' // ]); // await execute( // 'Windows x64 installer', // 'iscc.exe', // ['windows_installer/ollama.iss', '/qp', '/dAppVersion=$version'], // " > Inno Setup is not installed. Please install it from https://www.jrsoftware.org/isdl.php#stable\n Then add the Inno Setup directory to your PATH environment variable."); // ---------- // not supported by flutter yet // await execute('Windows arm64', flutterExecutable, [ // 'build', // 'windows', // '--obfuscate', // '--split-debug-info=build\\debugWindows' // ]); // await execute( // 'Windows arm64 installer', // 'iscc.exe', // [ // 'windows_installer/ollama.iss', // '/qp', // '/dAppVersion=$version', // '/dAppArchitectures=arm64' // ], // " > Inno Setup is not installed. Please install it from https://www.jrsoftware.org/isdl.php#stable\n Then add the Inno Setup directory to your PATH environment variable."); print('----------'); stdout.write('Copying build output to build\\.output '); try { final outputDir = Directory('build\\.output'); if (await outputDir.exists()) { await outputDir.delete(recursive: true); } await outputDir.create(); await copyFile( 'build\\app\\outputs\\flutter-apk\\app-release.apk', 'build\\.output\\ollama-android-v$version.apk', ); await copyFile( 'build\\windows\\x64\\runner\\ollama-windows-x64-v$version.exe', 'build\\.output\\ollama-windows-x64-v$version.exe', ); print('- done'); } catch (_) { print('- failed'); } print("Output: ${Directory('build\\.output').absolute.path.toString()}"); stdout.write('Done. Press Enter to exit. '); stdin.readLineSync(); } Future copyFile(String sourcePath, String destinationPath) async { final sourceFile = File(sourcePath); if (await sourceFile.exists()) { await sourceFile.copy(destinationPath); } } Future execute( String title, String command, List arguments, [ String? errorText, ]) async { stdout.write('$title '); ProcessResult process; try { process = await Process.run(command, arguments); } catch (e) { print('- failed'); print("> Errors:"); stdout.write('\x1B[31m'); print(e); stdout.write('\x1B[0m'); if (errorText != null) { print(errorText); } return; } process.exitCode != 0 ? print('- failed') : print('- done'); if (process.exitCode != 0) { print("> Errors:"); stdout.write('\x1B[31m'); process.stderr.toString().split('\n').forEach(print); stdout.write('\x1B[0m'); if (errorText != null) { print(errorText); } } }