कोड-जनरेटर को दूसरे कोड-जनरेटर के शीर्ष पर कैसे चलाएं?


14

कोड जनरेटर बनाने के लिए 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 की भाग फ़ाइल को आउटपुट करता है या हमारे स्वयं बिल्डर को पार्ट बिल्डर को कॉन्फ़िगर और इनवॉइस करने के लिए मैन्युअल चरण का उपयोग करके। डार्ट का उपयोग करके कमांड को चलाने का तीसरा तरीका है, await Process.start('bash',arguments,runInShell: true);लेकिन यह खेलने के लिए अंतिम उपाय की तरह है। वास्तव में मैं सिर्फ एक दिन पहले इस रेपो लिंक पर सभी कोड पीढ़ी के लोगों की कोशिश की .. तो मुझे लगता है कि मैं मददगार हो सकता है।
पार्थ दवे

यह कोड जनरेटर की रचना के बारे में है, जैसे कि मैं एक लिख सकता हूं जो दूसरे पर निर्भर करता है। इस तरह मुझे रखरखाव के उद्देश्य के लिए अपने स्रोतों को कांटा नहीं करना पड़ेगा।
रेमी रूसेलेट

जनरेशन स्टेप को सिंगल flutter generate/ में काम करना होगा pub run build_runner build। अन्यथा इसका उपयोग करना बहुत ही असामान्य होगा।
रेमी रूसेलेट

जवाबों:


3

अधिक जानकारी के लिए build.yaml config फ़ाइल प्रलेखन की जाँच करें, लेकिन मुझे लगता है कि आपको उस 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] संपत्ति में क्या पास होना चाहिए?
पेड्रो मासैंगो

2

यह केवल एनोटेशन के साथ संभव नहीं है क्योंकि शायद दो पैकेज हैं जिनमें दोनों का @JsonSerializableएनोटेशन है

दो संतृप्ति हैं:

  • आपको पता है कि आपके जनरेटर के बाद अन्य जनरेटर क्या चलना चाहिए।

    • https://stackoverflow.com/a/59605830/6877472 समाधानों में से एक है
    • आप अपने स्वयं के जनरेटर में अन्य जनरेटर के कोड का उपयोग कर सकते हैं और उनके जनरेटर के। फ़ंक्शन को कॉल कर सकते हैं। उदाहरण कोड:

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()विधि से एक नया उपयोगकर्ता उदाहरण बनाने के लिए, कंस्ट्रक्टर का उपयोग करें , जो उपयोगकर्ता के उदाहरण को मानचित्र में परिवर्तित करता है।

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अपनी परियोजना में शामिल करने के लिए एक नियमित निर्भरता और दो देव निर्भरताओं की आवश्यकता है ।

dependencies:
  json_annotation: ^0.2.3

dev_dependencies:
  build_runner: ^0.8.0
  json_serializable: ^0.5.0

JSON क्रमांकन पर अधिक जानकारी के लिए आप यहाँ देख सकते हैं

आप स्मोक लाइब्रेरी का उपयोग भी कर सकते हैं ।

यह मिरर्स की कार्यक्षमता का सबसेट है, लेकिन इसमें मिरर्स-आधारित और कोडगेन-आधारित कार्यान्वयन दोनों हैं। यह पॉलिमरडार्ट टीम द्वारा लिखा गया है, इसलिए यह "आधिकारिक" के करीब है जैसा कि हम प्राप्त करने जा रहे हैं।

विकसित करते समय, यह मिरर्स-आधारित एन्कोडिंग / डिकोडिंग का उपयोग करेगा; लेकिन प्रकाशन के लिए आप एक छोटा ट्रांसफार्मर बना सकते हैं जो कोड उत्पन्न करेगा।

सेठ लड्ड ने यहां एक कोड नमूना बनाया , जिसे मैंने बाल-वस्तुओं के समर्थन के लिए थोड़ा बढ़ाया :


वास्तव में वह अपना स्वयं का build_runner प्लगइन नहीं बना रहा है और जिससे उसे दूसरे धावक की तरह चलाने की ज़रूरत है जैसे कि बिल्ड रनर को ढेर करना।
पार्थ डेव

यह ऑफ टॉपिक है। json_serializableसिर्फ एक उदाहरण है और कुछ भी हो सकता है
रेमी रूसेलेट

मैं सिर्फ एक उदाहरण दे रहा था कि कैसे स्मोक लाइब्रेरी का उपयोग किया जा सकता है
श्रीराम नायर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.