Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/en/makers/appimage.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ mv appimagetool /usr/local/bin/
Add `make_config.yaml` to your project `linux/packaging/appimage` directory.

```yaml
package_name: hello_world
display_name: Hello World

icon: assets/logo.png
Expand Down
1 change: 1 addition & 0 deletions docs/en/makers/rpm.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ Install requirements:
Add `make_config.yaml` to your project `linux/packaging/rpm` directory.

```yaml
package_name: hello-world
icon: assets/logo.png
summary: A really cool application
group: Application/Emulator
Expand Down
1 change: 1 addition & 0 deletions docs/zh/makers/appimage.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ mv appimagetool /usr/local/bin/
将 `make_config.yaml` 添加到您的项目 `linux/packaging/appimage` 目录。

```yaml
package_name: hello_world
display_name: Hello World

icon: assets/logo.png
Expand Down
1 change: 1 addition & 0 deletions docs/zh/makers/rpm.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
将 `make_config.yaml` 添加到您的项目 `linux/packaging/rpm` 目录。

```yaml
package_name: hello-world
icon: assets/logo.png
summary: A really cool application
group: Application/Emulator
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'dart:io';

import 'package:flutter_app_packager/src/api/app_package_maker.dart';
import 'package:flutter_app_packager/src/makers/appimage/make_appimage_config.dart';
import 'package:image/image.dart' as img;
import 'package:path/path.dart' as path;
import 'package:shell_executor/shell_executor.dart';

Expand Down Expand Up @@ -116,38 +117,33 @@ class AppPackageMakerAppImage extends AppPackageMaker {
),
);

final icon256x256 = path.join(
makeConfig.packagingDirectory.path,
'${makeConfig.appName}.AppDir/usr/share/icons/hicolor/256x256/apps',
);
final icon128x128 = path.join(
makeConfig.packagingDirectory.path,
'${makeConfig.appName}.AppDir/usr/share/icons/hicolor/128x128/apps',
);

await $('mkdir', [
'-p',
icon128x128,
icon256x256,
]).then((value) {
if (value.exitCode != 0) {
throw MakeError(value.stderr as String);
}
});
for (final size in [128, 256, 512]) {
final iconDir = path.join(
makeConfig.packagingDirectory.path,
'${makeConfig.appName}.AppDir/usr/share/icons/hicolor/${size}x$size/apps',
);
final mkdirProcessRes = await $('mkdir', [
'-p',
iconDir,
]);

await iconFile.copy(
path.join(
icon128x128,
'${makeConfig.appName}${path.extension(makeConfig.icon)}',
),
);
if (mkdirProcessRes.exitCode != 0) throw MakeError();

await iconFile.copy(
path.join(
icon256x256,
'${makeConfig.appName}${path.extension(makeConfig.icon)}',
),
);
final iconBytes = await iconFile.readAsBytes();
final decodedIcon = img.decodeImage(iconBytes);
if (decodedIcon == null) {
throw MakeError('Failed to decode icon: ${makeConfig.icon}');
}
final icon = img.copyResize(
decodedIcon,
width: size,
height: size,
interpolation: img.Interpolation.average,
);
final newIconFile =
File(path.join(iconDir, '${makeConfig.appName}.png'));
await newIconFile.writeAsBytes(img.encodePng(icon));
}

if (makeConfig.metainfo != null) {
final metainfoDir = path.join(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,36 +22,36 @@ class AppImageAction {
List<String> arguments;

Map<String, dynamic> toJson() {
return {
'label': label,
'name': name,
'arguments': arguments,
};
return {'label': label, 'name': name, 'arguments': arguments};
}
}

class MakeAppImageConfig extends MakeConfig {
MakeAppImageConfig({
this.packageName,
required this.displayName,
required this.icon,
this.keywords = const [],
this.categories = const [],
this.actions = const [],
this.include = const [],
this.startupNotify = true,
this.startupWMClass,
this.genericName = 'A Flutter Application',
this.supportedMimeType,
this.metainfo,
});
factory MakeAppImageConfig.fromJson(Map<String, dynamic> map) {
return MakeAppImageConfig(
packageName: map['package_name'] as String?,
displayName: map['display_name'] as String,
icon: map['icon'] as String,
metainfo: map['metainfo'] as String?,
include: (map['include'] as List<dynamic>? ?? []).cast<String>(),
keywords: (map['keywords'] as List<dynamic>? ?? []).cast<String>(),
categories: (map['categories'] as List<dynamic>? ?? []).cast<String>(),
startupNotify: map['startup_notify'] as bool? ?? false,
startupWMClass: map['startup_wm_class'] as String?,
genericName: map['generic_name'] as String? ?? 'A Flutter Application',
actions: (map['actions'] as List? ?? [])
.map(
Expand All @@ -66,13 +66,18 @@ class MakeAppImageConfig extends MakeConfig {
);
}

@override
String get appName => packageName ?? super.appName;

final String icon;
final String? metainfo;
final List<String> keywords;
final List<String> categories;
final List<AppImageAction> actions;
final bool startupNotify;
final String? startupWMClass;
final String genericName;
final String? packageName;
final String displayName;
final List<String> include;
List<String>? supportedMimeType;
Expand All @@ -85,6 +90,7 @@ class MakeAppImageConfig extends MakeConfig {
'Icon': appName,
'Type': 'Application',
'StartupNotify': startupNotify ? 'true' : 'false',
if (startupWMClass != null) 'StartupWMClass': startupWMClass,
if (supportedMimeType != null && supportedMimeType!.isNotEmpty)
'MimeType': '${supportedMimeType!.join(';')};',
if (categories.isNotEmpty) 'Categories': categories.join(';'),
Expand All @@ -93,14 +99,16 @@ class MakeAppImageConfig extends MakeConfig {
'Actions': this.actions.map((e) => e.label).join(';'),
}.entries.map((e) => '${e.key}=${e.value}').join('\n');

final actions = this.actions.map((action) {
final fields = {
'Name': action.name,
'Exec':
'LD_LIBRARY_PATH=usr/lib $appName ${action.arguments.join(' ')} %u',
};
return '[Desktop Action ${action.label}]\n${fields.entries.map((e) => '${e.key}=${e.value}').join('\n')}';
}).join('\n\n');
final actions = this.actions
.map((action) {
final fields = {
'Name': action.name,
'Exec':
'LD_LIBRARY_PATH=usr/lib $appName ${action.arguments.join(' ')} %u',
};
return '[Desktop Action ${action.label}]\n${fields.entries.map((e) => '${e.key}=${e.value}').join('\n')}';
})
.join('\n\n');

return '[Desktop Entry]\n$fields\n\n$actions';
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'dart:io';

import 'package:flutter_app_packager/src/api/app_package_maker.dart';
import 'package:flutter_app_packager/src/makers/deb/make_deb_config.dart';
import 'package:image/image.dart' as img;
import 'package:path/path.dart' as path;
import 'package:shell_executor/shell_executor.dart';

Expand Down Expand Up @@ -46,18 +47,11 @@ class AppPackageMakerDeb extends AppPackageMaker {
/// /usr/share/applications
/// /usr/share/icons/hicolor/128x128/apps
/// /usr/share/icons/hicolor/256x256/apps
/// /usr/share/icons/hicolor/512x512/apps

final debianDir = path.join(packagingDirectory.path, 'DEBIAN');
final applicationsDir =
path.join(packagingDirectory.path, 'usr/share/applications');
final icon128Dir = path.join(
packagingDirectory.path,
'usr/share/icons/hicolor/128x128/apps',
);
final icon256Dir = path.join(
packagingDirectory.path,
'usr/share/icons/hicolor/256x256/apps',
);
final metainfoDir =
path.join(packagingDirectory.path, 'usr/share/metainfo');
final mkdirProcessResult = await $('mkdir', [
Expand All @@ -66,7 +60,6 @@ class AppPackageMakerDeb extends AppPackageMaker {
path.join(packagingDirectory.path, 'usr/share', makeConfig.appBinaryName),
applicationsDir,
if (makeConfig.metainfo != null) metainfoDir,
if (makeConfig.icon != null) ...[icon128Dir, icon256Dir],
]);

if (mkdirProcessResult.exitCode != 0) throw MakeError();
Expand All @@ -77,18 +70,33 @@ class AppPackageMakerDeb extends AppPackageMaker {
throw MakeError("provided icon ${makeConfig.icon} path wasn't found");
}

await iconFile.copy(
path.join(
icon128Dir,
makeConfig.appBinaryName + path.extension(makeConfig.icon!),
),
);
await iconFile.copy(
path.join(
icon256Dir,
makeConfig.appBinaryName + path.extension(makeConfig.icon!),
),
);
for (final size in [128, 256, 512]) {
final iconDir = path.join(
packagingDirectory.path,
'usr/share/icons/hicolor/${size}x$size/apps',
);
final mkdirProcessRes = await $('mkdir', [
'-p',
iconDir,
]);

if (mkdirProcessRes.exitCode != 0) throw MakeError();

final iconBytes = await iconFile.readAsBytes();
final decodedIcon = img.decodeImage(iconBytes);
if (decodedIcon == null) {
throw MakeError('Failed to decode icon: ${makeConfig.icon}');
}
final icon = img.copyResize(
decodedIcon,
width: size,
height: size,
interpolation: img.Interpolation.average,
);
final newIconFile =
File(path.join(iconDir, '${makeConfig.appBinaryName}.png'));
await newIconFile.writeAsBytes(img.encodePng(icon));
}
}
if (makeConfig.metainfo != null) {
final metainfoPath =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import 'package:flutter_app_packager/src/api/app_package_maker.dart';
# the name used to display in the OS. Specifically desktop
# entry name
display_name: Hola Amigos
include_build_number: true

# package name for debian/apt repository
# the name should be all lowercase with -+.
Expand Down Expand Up @@ -127,6 +128,7 @@ class MakeDebConfig extends MakeLinuxPackageConfig {
required this.maintainer,
this.startupNotify = true,
this.startupWMClass,
this.includeBuildNumber = true,
this.essential = false,
List<String>? postinstallScripts,
List<String>? postuninstallScripts,
Expand Down Expand Up @@ -156,6 +158,7 @@ class MakeDebConfig extends MakeLinuxPackageConfig {

factory MakeDebConfig.fromJson(Map<String, dynamic> map) {
return MakeDebConfig(
includeBuildNumber: map['include_build_number'] as bool? ?? true,
displayName: map['display_name'],
packageName: map['package_name'],
maintainer:
Expand Down Expand Up @@ -226,6 +229,7 @@ class MakeDebConfig extends MakeLinuxPackageConfig {
);
}

bool includeBuildNumber;
String displayName;
String packageName;
String maintainer;
Expand Down Expand Up @@ -274,7 +278,7 @@ class MakeDebConfig extends MakeLinuxPackageConfig {
'CONTROL': {
'Maintainer': maintainer,
'Package': packageName,
'Version': appVersion.toString(),
'Version': includeBuildNumber ? appVersion.toString() : appBuildName,
'Section': section,
'Priority': priority,
'Architecture': _getArchitecture(),
Expand All @@ -298,7 +302,6 @@ class MakeDebConfig extends MakeLinuxPackageConfig {
}..removeWhere((key, value) => value == null),
'DESKTOP': {
'Type': 'Application',
'Version': appVersion.toString(),
'Name': displayName,
'GenericName': genericName,
'Icon': appBinaryName,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import 'package:path/path.dart' as p;

class MakeExeConfig extends MakeConfig {
MakeExeConfig({
this.packageName,
this.scriptTemplate,
required this.appId,
this.executableName,
Expand Down Expand Up @@ -34,6 +35,7 @@ class MakeExeConfig extends MakeConfig {
MakeExeConfig makeExeConfig = MakeExeConfig(
scriptTemplate: json['script_template'],
appId: json['app_id'] ?? json['appId'],
packageName: json['package_name'],
executableName: json['executable_name'],
displayName: json['display_name'],
publisherName: json['publisher_name'] ?? json['appPublisher'],
Expand All @@ -48,6 +50,10 @@ class MakeExeConfig extends MakeConfig {
return makeExeConfig;
}

@override
String get appName => packageName ?? super.appName;

String? packageName;
String? scriptTemplate;
final String appId;
String? executableName;
Expand Down Expand Up @@ -83,6 +89,7 @@ class MakeExeConfig extends MakeConfig {
'app_id': appId,
'app_name': appName,
'app_version': appVersion.toString(),
'package_name': packageName,
'executable_name': executableName,
'display_name': displayName,
'publisher_name': publisherName,
Expand Down
Loading
Loading