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.