chore: change Flutter build mode to release in local.properties and add an empty line to JSON response schema
This commit is contained in:
100
tools/check_unused_assets.dart
Normal file
100
tools/check_unused_assets.dart
Normal file
@@ -0,0 +1,100 @@
|
||||
/// اسکریپت برای بررسی Assets استفاده نشده
|
||||
///
|
||||
/// استفاده:
|
||||
/// dart run tools/check_unused_assets.dart
|
||||
|
||||
import 'dart:io';
|
||||
|
||||
void main() async {
|
||||
print('🔍 در حال بررسی Assets استفاده نشده...\n');
|
||||
|
||||
// لیست تمام assets
|
||||
final assets = <String>[];
|
||||
|
||||
// خواندن assets از پوشهها
|
||||
final assetDirs = [
|
||||
'assets/icons',
|
||||
'assets/images',
|
||||
'assets/logos',
|
||||
'assets/vec',
|
||||
'assets/anim',
|
||||
];
|
||||
|
||||
for (final dir in assetDirs) {
|
||||
final directory = Directory(dir);
|
||||
if (await directory.exists()) {
|
||||
await for (final entity in directory.list(recursive: true)) {
|
||||
if (entity is File) {
|
||||
final relativePath = entity.path.replaceAll('\\', '/');
|
||||
assets.add(relativePath);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
print('📦 تعداد کل Assets: ${assets.length}\n');
|
||||
|
||||
// جستجو در کد
|
||||
final usedAssets = <String>{};
|
||||
final codeFiles = <File>[];
|
||||
|
||||
// جستجو در پوشه lib و packages
|
||||
await _findDartFiles(Directory('lib'), codeFiles);
|
||||
await _findDartFiles(Directory('packages'), codeFiles);
|
||||
|
||||
print('📝 در حال جستجو در ${codeFiles.length} فایل Dart...\n');
|
||||
|
||||
for (final file in codeFiles) {
|
||||
final content = await file.readAsString();
|
||||
|
||||
for (final asset in assets) {
|
||||
// استخراج نام فایل از مسیر
|
||||
final fileName = asset.split('/').last;
|
||||
final fileNameWithoutExt = fileName.split('.').first;
|
||||
|
||||
// جستجوی استفاده در کد
|
||||
if (content.contains(asset) ||
|
||||
content.contains(fileName) ||
|
||||
content.contains(fileNameWithoutExt) ||
|
||||
content.contains('Assets.${_getAssetCategory(asset)}')) {
|
||||
usedAssets.add(asset);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// پیدا کردن assets استفاده نشده
|
||||
final unusedAssets = assets.where((asset) => !usedAssets.contains(asset)).toList();
|
||||
|
||||
print('✅ Assets استفاده شده: ${usedAssets.length}');
|
||||
print('❌ Assets استفاده نشده: ${unusedAssets.length}\n');
|
||||
|
||||
if (unusedAssets.isNotEmpty) {
|
||||
print('⚠️ لیست Assets استفاده نشده:\n');
|
||||
for (final asset in unusedAssets) {
|
||||
print(' - $asset');
|
||||
}
|
||||
print('\n💡 میتونید این فایلها رو حذف کنید تا حجم اپ کم بشه.');
|
||||
} else {
|
||||
print('🎉 همه Assets استفاده میشن!');
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _findDartFiles(Directory dir, List<File> files) async {
|
||||
if (!await dir.exists()) return;
|
||||
|
||||
await for (final entity in dir.list(recursive: true)) {
|
||||
if (entity is File && entity.path.endsWith('.dart')) {
|
||||
files.add(entity);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
String _getAssetCategory(String assetPath) {
|
||||
if (assetPath.contains('icons/')) return 'icons';
|
||||
if (assetPath.contains('images/')) return 'images';
|
||||
if (assetPath.contains('logos/')) return 'logos';
|
||||
if (assetPath.contains('vec/')) return 'vec';
|
||||
if (assetPath.contains('anim/')) return 'anim';
|
||||
return 'unknown';
|
||||
}
|
||||
|
||||
80
tools/find_duplicate_assets.dart
Normal file
80
tools/find_duplicate_assets.dart
Normal file
@@ -0,0 +1,80 @@
|
||||
/// اسکریپت برای پیدا کردن Assets تکراری (SVG و VEC)
|
||||
///
|
||||
/// استفاده:
|
||||
/// dart run tools/find_duplicate_assets.dart
|
||||
|
||||
import 'dart:io';
|
||||
|
||||
void main() async {
|
||||
print('🔍 در حال بررسی Assets تکراری...\n');
|
||||
|
||||
final svgFiles = <String>[];
|
||||
final vecFiles = <String>[];
|
||||
|
||||
// خواندن SVG files
|
||||
final iconsDir = Directory('assets/icons');
|
||||
if (await iconsDir.exists()) {
|
||||
await for (final entity in iconsDir.list()) {
|
||||
if (entity is File && entity.path.endsWith('.svg')) {
|
||||
final fileName = entity.path.split(Platform.pathSeparator).last;
|
||||
svgFiles.add(fileName.replaceAll('.svg', ''));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// خواندن VEC files
|
||||
final vecDir = Directory('assets/vec');
|
||||
if (await vecDir.exists()) {
|
||||
await for (final entity in vecDir.list()) {
|
||||
if (entity is File && entity.path.endsWith('.vec')) {
|
||||
final fileName = entity.path.split(Platform.pathSeparator).last;
|
||||
vecFiles.add(fileName.replaceAll('.svg.vec', '').replaceAll('.vec', ''));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
print('📊 آمار:');
|
||||
print(' SVG files: ${svgFiles.length}');
|
||||
print(' VEC files: ${vecFiles.length}\n');
|
||||
|
||||
// پیدا کردن تکراریها
|
||||
final duplicates = <String>[];
|
||||
for (final svg in svgFiles) {
|
||||
if (vecFiles.contains(svg)) {
|
||||
duplicates.add(svg);
|
||||
}
|
||||
}
|
||||
|
||||
if (duplicates.isNotEmpty) {
|
||||
print('⚠️ پیدا شد ${duplicates.length} asset تکراری:\n');
|
||||
for (final dup in duplicates) {
|
||||
print(' - $dup');
|
||||
print(' 📄 assets/icons/$dup.svg');
|
||||
print(' 📄 assets/vec/$dup.svg.vec\n');
|
||||
}
|
||||
|
||||
print('💡 پیشنهاد:');
|
||||
print(' اگر از VEC استفاده میکنید، SVG ها رو حذف کنید');
|
||||
print(' یا برعکس، اگر از SVG استفاده میکنید، VEC ها رو حذف کنید');
|
||||
print(' این کار میتونه حجم اپ رو تا 50% کاهش بده!\n');
|
||||
|
||||
// محاسبه حجم تقریبی
|
||||
print('📦 حجم تقریبی قابل صرفهجویی:');
|
||||
print(' ${duplicates.length} فایل × ~10KB = ~${(duplicates.length * 10 / 1024).toStringAsFixed(2)} MB');
|
||||
} else {
|
||||
print('✅ هیچ asset تکراری پیدا نشد!');
|
||||
}
|
||||
|
||||
// پیدا کردن SVG های بدون VEC
|
||||
final svgOnly = svgFiles.where((svg) => !vecFiles.contains(svg)).toList();
|
||||
if (svgOnly.isNotEmpty) {
|
||||
print('\n📄 SVG های بدون نسخه VEC: ${svgOnly.length}');
|
||||
}
|
||||
|
||||
// پیدا کردن VEC های بدون SVG
|
||||
final vecOnly = vecFiles.where((vec) => !svgFiles.contains(vec)).toList();
|
||||
if (vecOnly.isNotEmpty) {
|
||||
print('📄 VEC های بدون نسخه SVG: ${vecOnly.length}');
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user