Başka bir kod üretecinin üstünde kod üreteci nasıl çalıştırılır?


14

Bir kod üreteci yapmak için source_gen yığınını kullanarak, başka bir oluşturucunun (daha spesifik olarak json_serializable) girişi olacak kod üreten bir oluşturucuyu nasıl yapabilirim ?

Örneğin:

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

Bu, daha sonra gönderilmesi gereken kodu çıkaran bir kod oluşturucu örneğidir json_serializable

json_serializableBurada doğru bir şekilde üretilen ne yapabilirim ?


Cevabım yok ama bu bağlantı sizi iyi yönde gösterebilir mi? Ben de ilgileniyorum. Daha fazla araştırma yapmak için bu bağlantıyı işaretledim
Frank Treacy

Sorunuzla ilgili vakayı anlamaya çalışıyorum. daha fazla ayrıntı verebilir misin? bunu çözmenin iki yolu vardır, ya o JSON'un parça dosyasını çıktılayan gerçek yöntemi çağırarak ya da parça oluşturucuyu kendimizi yapılandırmak ve çağırmak için manuel bir adım kullanarak. Komutu dart kullanarak çalıştırmanın üçüncü yolu var await Process.start('bash',arguments,runInShell: true);ama oynamak için son çare. Aslında ben sadece bir gün önce bu repo bağlantı tüm kod oluşturma mantık denedim .. Ben yardımcı olabilir düşünüyorum.
Parth Dave

Kod üreteci hakkında, başka birine bağlı bir yazabilirsiniz böylece hakkında. Bu şekilde, kaynaklarını sürdürülebilirlik amacıyla çatallamak zorunda kalmayacağım.
Rémi Rousselet

Üretim adımı tek bir flutter generate/ pub run build_runner build. Aksi takdirde kullanmak çok sıra dışı olurdu.
Rémi Rousselet

Yanıtlar:


3

Daha fazla bilgi için build.yaml yapılandırma dosyası belgelerine bakın, ancak tanımlı olandan sonra başka bir derlemenin yürütülmesine izin veren applies_buildersparametreyi kullanmanız gerektiğini düşünüyorum .

Örnek, .tar.gz dosyalarını oluşturan ve .tar.gz dosyalarını girdi olarak alan başka bir derlemeyi yürüten bir oluşturucuyu gösterir.

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

yani source_gensenin için inşa etmelisin

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

ve diğer kurucuyu yapılandırın

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] özelliğine ne geçmeliyim?
Pedro Massango

2

Yalnızca ek açıklama ile mümkün değildir, çünkü her ikisinde de @JsonSerializableek açıklama bulunan iki paket olabilir

İki durum vardır:

  • Jeneratörünüzden sonra diğer jeneratörlerin neyi çalıştırması gerektiğini biliyorsunuz.


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

}
  • Jeneratörünüzden sonra diğer jeneratörlerin ne çalıştırması gerektiğini bilmiyorsunuz.

Ne yazık ki şu anda source_gen'e jeneratörünüzün kod üretimi gerektiren bir kod üretebileceğini söylemenin bir yolu yoktur.

Abone olmak istiyorsanız https://github.com/dart-lang/source_gen/issues/442 burada bir sorun oluşturdum


-2

jsonDecode()Yöntem bağımsız değişkeni olarak JSON dizesiyle işlevi çağırarak JSON'un kodunu çözebilirsiniz .

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

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

Şimdi, User.fromJson()bir harita yapısından yeni bir Kullanıcı örneği ve bir Kullanıcı örneğini haritaya toJson()dönüştüren bir yöntem oluşturmak için yapıcıyı kullanın.

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 sizin için JSON serileştirme kaynak plakasını üreten otomatik bir kaynak kodu üretecidir.

Bir düzenli bağımlılığa ve json_serializableprojenize dahil etmek için iki geliştirici bağımlılığa ihtiyacınız vardır .

dependencies:
  json_annotation: ^0.2.3

dev_dependencies:
  build_runner: ^0.8.0
  json_serializable: ^0.5.0

JSON serileştirme hakkında daha fazla bilgi için buraya başvurabilirsiniz

Smoke kütüphanesini de kullanabilirsiniz .

Bu, Mirrors işlevinin bir alt kümesidir, ancak hem Mirrors hem de Codegen tabanlı bir uygulamaya sahiptir. PolymerDart ekibi tarafından yazıldı, bu yüzden alacağımız kadar "Resmi" ye yakın.

Geliştirirken, Mirrors tabanlı kodlama / kod çözmeyi kullanır; ancak yayınlamak için kod oluşturacak küçük bir transformatör oluşturabilirsiniz.

Seth Ladd , alt nesneleri desteklemek için biraz genişlettiğim bir kod örneği oluşturdu :


Hayır aslında kendi build_runner eklentisini oluşturuyor ve başka bir koşucuyu inşa koşucusunun istiflenmesi gibi çalıştırması gerekiyor.
Dave Dave

Bu konu dışı. json_serializablesadece bir örnek ve her şey olabilir
Rémi Rousselet

Ben sadece duman kütüphanesinin nasıl kullanılabileceğine dair bir örnek veriyordum
Sreeram Nair
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.