Is there a way to put the generated files in a separate folder in flutter?

In my app, I use freezed with json_serializable. In the folder, where I put all my data models a lot of generated files, like model.g.dart, model.freeezed.dart. Is there any possibility to move all generated files like that to a separate folder in the project, like generated?

Upvotes: 20

Views: 6699

Answers (3)

I created a build.yaml and used this code:

targets:
  $default:
    builders:
      source_gen:combining_builder:
        options:
          build_extensions:
            '^lib/network/models/{{dir}}/{{file}}.dart': 'lib/network/models/{{dir}}/generated/{{file}}.g.dart'
      freezed:
        options:
          build_extensions:
            '^lib/network/models/{{dir}}/{{file}}.dart': 'lib/network/models/{{dir}}/generated/{{file}}.freezed.dart'

If my tree is like this:

lib/network/models/folderName/my_model.dart
lib/network/models/folderName/my_model2.dart

lib/network/models/folderName2/my_model3.dart
lib/network/models/folderName2/my_model4.dart

The output will be

lib/network/models/folderName/generated/my_model.g.dart
lib/network/models/folderName/generated/my_model.freezed.dart
lib/network/models/folderName/generated/my_model2.g.dart
lib/network/models/folderName/generated/my_model2.freezed.dart
lib/network/models/folderName/my_model.dart
lib/network/models/folderName/my_model2.dart


lib/network/models/folderName2/generated/my_model3.g.dart
lib/network/models/folderName2/generated/my_model3.freezed.dart
lib/network/models/folderName2/generated/my_model4.g.dart
lib/network/models/folderName2/generated/my_model4.freezed.dart
lib/network/models/folderName2/my_model3.dart
lib/network/models/folderName2/my_model4.dart

So all my generated files are inside a generated folder at the same level as the file. Therefore, on the my_model.dart file, you need to include:

part 'generated/my_model.freezed.dart';
part 'generated/my_model.g.dart';

You will need to modify the path at build.yaml to match the path to your models. You will also need to modify the part route to match the output route you have indicated in the build.yaml file.

Upvotes: 2

Iliya Gug
Iliya Gug

Reputation: 137

Here's working example from stackoveflow:

Basically create build.yaml file like this, it will generate files in generated folder:

targets:
  $default:
    builders:
      source_gen|combining_builder:
        generate_for:
          - lib/**.dart
        options:
          build_extensions:
            '^lib/{{}}.dart': 'lib/generated/{{}}.g.dart'
      freezed|freezed:
        enabled: true
        options:
          build_extensions:
            '^lib/{{}}.dart': 'lib/generated/{{}}.freezed.dart'

Don't forget to add generated to part.

import 'package:freezed_annotation/freezed_annotation.dart';

part 'generated/person.g.dart';
part 'generated/person.freezed.dart';

@freezed
class Person with _$Person {
  const factory Person({
    required String firstName,
    required String lastName,
    required int age,
  }) = _Person;

  factory Person.fromJson(Map<String, Object?> json)
  => _$PersonFromJson(json);
}

Upvotes: 6

Eugene Kuzmenko
Eugene Kuzmenko

Reputation: 1497

Accordint to the build_runner documentation

flutter pub run build_runner build --output <dirname>

or

flutter pub run build_runner build --output models:<directory name>

to output only the models directory

Upvotes: 4

Related Questions