Làm cách nào để chạy trình tạo mã trên đầu trình tạo mã khác?


14

Sử dụng ngăn xếp source_gen để tạo trình tạo mã, làm cách nào tôi có thể tạo trình tạo tạo mã sẽ là đầu vào của trình tạo khác (cụ thể hơn json_serializable)?

Ví dụ: xem xét:

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);
}
''';
  }
}

Đây là một ví dụ về trình tạo mã mà mã đầu ra cần được gửi đến json_serializable

Tôi có thể làm gì để json_serializabletạo chính xác ở đây?


Tôi không có câu trả lời nhưng liên kết này có thể chỉ cho bạn một hướng tốt? Tôi cũng quan tâm. Tôi đã đánh dấu liên kết đó để nghiên cứu thêm
Frank Treacy

Tôi đang đi được nửa đường để hiểu trường hợp cho câu hỏi của bạn. bạn có thể nói rõ hơn không? có hai cách để giải quyết vấn đề này bằng cách gọi phương thức thực tế xuất ra tệp phần của JSON đó hoặc bằng cách sử dụng một bước thủ công để định cấu hình và gọi trình xây dựng phần của chúng ta. Có cách thứ ba để chạy lệnh bằng phi tiêu await Process.start('bash',arguments,runInShell: true);nhưng đó là cách cuối cùng để chơi. thực sự tôi đã thử tất cả các logic tạo mã một ngày trước trên liên kết repo này vì vậy tôi nghĩ rằng tôi có thể hữu ích.
Parth Dave

Đó là về việc soạn thảo trình tạo mã, sao cho tôi có thể viết một cái phụ thuộc vào cái khác. Bằng cách này, tôi sẽ không phải rẽ nhánh nguồn của nó cho mục đích bảo trì.
Rémi Rousselet

Bước thế hệ phải làm việc trong một flutter generate/ pub run build_runner build. Nếu không, nó sẽ rất bất thường khi sử dụng.
Rémi Rousselet

Câu trả lời:


3

Kiểm tra tài liệu tệp cấu hình build.yaml để biết thêm thông tin, nhưng tôi nghĩ bạn nên sử dụng applies_builderstham số cho phép thực thi một bản dựng khác sau khi xác định.

Ví dụ này cho thấy một trình xây dựng tạo các tệp .tar.gz và sau đó thực thi một bản dựng khác lấy các tệp .tar.gz làm đầu vào

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"]

Vì vậy, với source_genbạn nên thực hiện cho bản dựng của bạn

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

và cấu hình trình xây dựng khác

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"]

Những gì tôi nên vượt qua trong thuộc tính [application_builders]?
Pedro Massango

2

Không thể chỉ với chú thích vì có thể có hai gói mà cả hai đều có @JsonSerializablechú thích

Có hai điều kiện:

  • Bạn biết những gì máy phát điện khác nên chạy sau máy phát điện của bạn.

    • https://stackoverflow.com/a/59605830/6877472 là một trong những giải pháp
    • bạn có thể sử dụng mã của trình tạo khác trong trình tạo của riêng bạn và gọi hàm.generate của trình tạo của chúng. mã ví dụ:

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);
          }
        ''');
     }

}
  • Bạn không biết những gì máy phát điện khác nên chạy sau máy phát điện của bạn.

Thật không may, hiện tại không có cách nào để nói với source_gen rằng trình tạo của bạn có thể tạo mã cần tạo mã.

Tôi đã tạo một vấn đề ở đây https://github.com/dart-lang/source_gen/issues/442 nếu bạn muốn đăng ký


-2

Bạn có thể giải mã JSON bằng cách gọi jsonDecode()hàm, với chuỗi JSON làm đối số phương thức.

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

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

Bây giờ, Sử dụng hàm User.fromJson()tạo, để xây dựng một cá thể Người dùng mới từ cấu trúc bản đồ và toJson()phương thức, để chuyển đổi một cá thể Người dùng thành bản đồ.

worker.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 là một trình tạo mã nguồn tự động tạo ra bản tóm tắt JSON serialization cho bạn.

Bạn cần một phụ thuộc thường xuyên và hai phụ thuộc dev để đưa json_serializablevào dự án của bạn.

dependencies:
  json_annotation: ^0.2.3

dev_dependencies:
  build_runner: ^0.8.0
  json_serializable: ^0.5.0

Để biết thêm chi tiết về tuần tự hóa JSON, bạn có thể tham khảo tại đây

bạn cũng có thể sử dụng thư viện Khói .

Đây là một tập hợp con của chức năng Mirrors nhưng có cả triển khai dựa trên Mirrors và dựa trên Codegen. Nó được viết bởi nhóm PolymerDart, vì vậy nó gần với "Chính thức" như chúng ta sẽ nhận được.

Trong khi phát triển, nó sẽ sử dụng mã hóa / giải mã dựa trên Gương; nhưng để xuất bản, bạn có thể tạo một biến áp nhỏ sẽ tạo mã.

Seth Ladd đã tạo một mẫu mã ở đây , mà tôi đã mở rộng một chút để hỗ trợ các đối tượng con:


Không thực sự anh ta đang tạo plugin build_runner của riêng mình và từ đó anh ta cần chạy một kiểu chạy khác giống như xếp chồng của người chạy xây dựng.
Parth Dave

Đây là ngoài chủ đề. json_serializablechỉ là một ví dụ và có thể là bất cứ điều gì
Rémi Rousselet

tôi chỉ đưa ra một ví dụ về cách sử dụng thư viện khói
Sreeram Nair
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.