다른 코드 생성기에서 코드 생성기를 실행하는 방법은 무엇입니까?


14

은 Using source_gen의 어떻게 다른 발전기 (더 구체적으로의 입력 될 코드를 생성하는 발전기를 만들 수 코드 생성기를 만들기 위해 스택 json_serializable)?

예를 들어, 다음을 고려하십시오.

class Example extends Generator {
  @override
  String generate(LibraryReader library, BuildStep buildStep) {
    return '''
@JsonSerializable(nullable: false)
class Person {
  final String firstName;
  final String lastName;
  final DateTime dateOfBirth;
  Person({this.firstName, this.lastName, this.dateOfBirth});
  factory Person.fromJson(Map<String, dynamic> json) => _PersonFromJson(json);
  Map<String, dynamic> toJson() => _PersonToJson(this);
}
''';
  }
}

다음은 코드를 출력하는 코드 생성기의 예입니다. json_serializable

나는 무엇 때문에 이렇게 할 수있는 json_serializable제대로 여기에 생성?


답변이 없지만 이 링크 를 통해 좋은 방향으로 안내 할 수 있습니까? 나는 또한 관심이있다. 내가 링크 추가 연구를 할 것을 북마크를
프랭크 트레이시에게

귀하의 질문에 대한 사례를 이해하기 위해 반쯤 진행되었습니다. 더 정교하게 할 수 있습니까? 해당 JSON의 파트 파일을 출력하는 실제 메소드를 호출하거나 수동 단계를 사용하여 파트 빌더를 구성하고 호출하여이를 해결하는 두 가지 방법이 있습니다. dart를 사용하여 명령을 실행하는 세 번째 방법이 await Process.start('bash',arguments,runInShell: true);있지만 재생하는 마지막 방법입니다. 실제로이 방금 전이 repo 링크 에서 모든 코드 생성 논리를 시도했습니다 . 도움이 될 것 같습니다.
Parth Dave

코드 생성기를 작성하여 다른 코드에 의존하는 코드 생성기를 작성할 수 있습니다. 이렇게하면 유지 관리 목적으로 소스를 포크 할 필요가 없습니다.
Rémi Rousselet

생성 단계는 단일 flutter generate/로 작동해야합니다 pub run build_runner build. 그렇지 않으면 사용이 매우 이례적입니다.
Rémi Rousselet

답변:


3

자세한 내용은 build.yaml 구성 파일 설명서를 확인하십시오.하지만 정의 된 빌드 후에 다른 빌드를 실행할 수 있는 applies_builders매개 변수 를 사용해야한다고 생각합니다 .

이 예는 .tar.gz 파일을 생성 한 다음 .tar.gz 파일을 입력으로 사용하는 다른 빌드를 실행하는 빌더를 보여줍니다.

builders:
  # The regular builder config, creates .tar.gz files.
  regular_builder:
    import: "package:my_package/builder.dart"
    builder_factories: ["myBuilder"]
    build_extensions: {".dart": [".tar.gz"]}
    auto_apply: dependents
    apply_builders: [":archive_extract_builder"]
post_process_builders:
  # The post process builder config, extracts .tar.gz files.
  extract_archive_builder:
    import: "package:my_package/extract_archive_builder.dart"
    builder_factory: "myExtractArchiveBuilder"
    input_extensions: [".tar.gz"]

따라서 source_gen빌드를 구현해야합니다.

applies_builders: ["source_gen|combining_builder", "json_serializable"]

다른 빌더를 구성하십시오.

json_serializable:
    import: "package:json_serializable/builder.dart"
    builder_factories: ["jsonSerializable"]
    build_extensions: {".dart": ["json_serializable.g.part"]}
    auto_apply: dependents
    build_to: cache
    applies_builders: ["source_gen|combining_builder"]

[apply_builders] 속성에서 무엇을 전달해야합니까?
페드로 Massango

2

어노테이션만으로는 가능하지 않습니다. 두 패키지 모두 @JsonSerializable 주석을

두 가지 상황이 있습니다.

  • 당신은 당신의 발전기 다음에 다른 발전기가 무엇을해야하는지 알고 있습니다.

    • https://stackoverflow.com/a/59605830/6877472 는 솔루션 중 하나입니다
    • 자신의 생성기에서 다른 생성기 코드를 사용하고 해당 생성기의 .generate 함수를 호출 할 수 있습니다. 예제 코드 :

class Example extends Generator {
    @override
    String generate(LibraryReader library, BuildStep buildStep) {
      return JsonSerializable().generate('''
          @JsonSerializable(nullable: false)
          class Person {
            final String firstName;
            final String lastName;
            final DateTime dateOfBirth;
            Person({this.firstName, this.lastName, this.dateOfBirth});
            factory Person.fromJson(Map<String, dynamic> json) => _PersonFromJson(json);
            Map<String, dynamic> toJson() => _PersonToJson(this);
          }
        ''');
     }

}
  • 당신은 당신의 발전기 다음에 다른 발전기가 무엇을 실행해야하는지 모른다.

불행히도 현재 생성기가 코드 생성이 필요한 코드를 생성 할 수 있다고 source_gen에 알리는 방법이 없습니다.

구독하려면 https://github.com/dart-lang/source_gen/issues/442 에서 문제를 만들었습니다.


-2

jsonDecode()JSON 문자열을 메소드 인수로 사용하여 함수 를 호출하여 JSON을 디코딩 할 수 있습니다 .

Map<String, dynamic> user = jsonDecode(jsonString);

print('Howdy, ${user['name']}!');
print('We sent the verification link to ${user['email']}.');

이제 User.fromJson()생성자를 사용하여 맵 구조와 toJson()사용자 인스턴스를 맵으로 변환하는 메소드 에서 새 User 인스턴스를 구성하십시오 .

employee.dart

class Employee {
  final String name;
  final String id;

  Employee(this.name, this.id);

  Employee.fromJson(Map<String, dynamic> json)
      : name = json['name'],
        id = json['id'];

  Map<String, dynamic> toJson() =>
    {
      'name': name,
      'id': id,
    };
}

json_serializable JSON 직렬화 상용구를 생성하는 자동 소스 코드 생성기입니다.

json_serializable프로젝트 에 포함하려면 하나의 정규 종속성과 두 개의 dev 종속성이 필요 합니다.

dependencies:
  json_annotation: ^0.2.3

dev_dependencies:
  build_runner: ^0.8.0
  json_serializable: ^0.5.0

JSON 직렬화에 대한 자세한 내용은 여기 를 참조 하십시오.

Smoke 라이브러리 를 사용할 수도 있습니다 .

미러 기능의 하위 세트이지만 미러 기반 구현과 Codegen 기반 구현이 모두 있습니다. PolymerDart 팀이 작성 했으므로 "공식"에 가깝습니다.

개발하는 동안 미러 기반 인코딩 / 디코딩을 사용합니다. 그러나 게시를 위해 코드를 생성하는 소형 변압기를 만들 수 있습니다.

세스 래드이 만들어 여기에 코드 샘플 내가 약간 확장 지원 아동 개체를 :


실제로 그는 자신의 build_runner 플러그인을 만들지 않으며 빌드 러너 스택과 같은 다른 러너 유형을 실행해야합니다.
Parth Dave

이것은 주제가 아닙니다. json_serializable예일 뿐이며 무엇이든 될 수 있습니다
Rémi Rousselet

연기 라이브러리를 사용하는 방법에 대한 예를
들었습니다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.