অন্য কোড-জেনারেটরের শীর্ষে একটি কোড-জেনারেটর কীভাবে চালানো যায়?


14

কোড জেনারেটর তৈরি করতে সোর্স_জেন স্ট্যাক ব্যবহার করে , আমি কীভাবে এমন একটি জেনারেটর তৈরি করতে পারি যা এমন একটি জেনারেটর তৈরি করতে পারে যা অন্য জেনারেটরের ইনপুট হবে (আরও নির্দিষ্টভাবে 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এখানে সঠিকভাবে উত্পন্ন?


আমার কোনও উত্তর নেই তবে এই লিঙ্কটি আপনাকে একটি ভাল দিক নির্দেশ করতে পারে? আমিও আগ্রহী। আরও গবেষণা করার জন্য আমি সেই লিঙ্কটি বুকমার্ক করেছি
ফ্রাঙ্ক ট্রেইসি

আপনার প্রশ্নের জন্য আমি বুঝতে অর্ধেক পথ পেরিয়ে এসেছি। আপনি আরও বিস্তারিত বলতে পারেন? এটি সমাধানের দুটি উপায় আছে যা আসল পদ্ধতিতে কল করে যা সেই জেএসওনের অংশ ফাইলকে আউটপুট করে বা অংশ স্বরকে কনফিগার করতে এবং অনুরোধ করার জন্য একটি ম্যানুয়াল পদক্ষেপ ব্যবহার করে। কমান্ডটি ডার্ট ব্যবহার করে চালানোর তৃতীয় উপায় আছে await Process.start('bash',arguments,runInShell: true);তবে এটি খেলতে সর্বশেষ উপায়। আসলে আমি এই রেপো লিঙ্কে একদিন আগে সমস্ত কোড প্রজন্মের লজিকগুলি চেষ্টা করেছি তাই .. আমি মনে করি আমি সহায়ক হতে পারি।
পার্থ ডেভ

এটি কোড জেনারেটর রচনা সম্পর্কে, যেমন আমি এটি লিখতে পারি যা অন্যটির উপর নির্ভর করে। এইভাবে আমাকে রক্ষণাবেক্ষণের উদ্দেশ্যে এর উত্সগুলি কাঁটাতে হবে না।
রামি রুসলেট

প্রজন্মের পদক্ষেপটি অবশ্যই একক flutter generate/ এ কাজ করবে pub run build_runner build। অন্যথায় এটি ব্যবহার করা খুব অস্বাভাবিক হবে।
রামি রুসলেট

উত্তর:


3

আরও তথ্যের জন্য build.yaml কনফিগ ফাইল ডকুমেন্টেশন চেক, কিন্তু আমি মনে করি আপনি ব্যবহার করা উচিত applies_buildersPARAM যে সংজ্ঞায়িত এক পরে অন্য বিল্ড চালানো পারেন।

উদাহরণটি এমন একটি বিল্ডারকে দেখায় যা .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"]

[প্রয়োগ_আমারকদের] সম্পত্তিতে আমার কী পাস করা উচিত?
পেড্রো ম্যাসাঙ্গো

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

}
  • আপনার জেনারেটরের পরে অন্যান্য জেনারেটরগুলির কী চলতে হবে তা আপনি জানেন না।

দুর্ভাগ্যক্রমে বর্তমানে উত্স_জেনকে বলার কোনও উপায় নেই যে আপনার জেনারেটরের একটি কোড তৈরি করতে পারে যা কোড প্রজন্মের প্রয়োজন।

আমি এখানে একটি সমস্যা তৈরি করেছি 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_serializableআপনার প্রকল্পে অন্তর্ভুক্ত করতে আপনার একটি নিয়মিত নির্ভরতা এবং দুটি দেব নির্ভরতা প্রয়োজন ।

dependencies:
  json_annotation: ^0.2.3

dev_dependencies:
  build_runner: ^0.8.0
  json_serializable: ^0.5.0

জেএসএন সিরিয়ালাইজেশন সম্পর্কিত আরও তথ্যের জন্য আপনি এখানে উল্লেখ করতে পারেন

আপনি ধূমপান গ্রন্থাগারও ব্যবহার করতে পারেন ।

এটি আয়না কার্যকারিতার একটি উপসেট তবে এটি আয়না-ভিত্তিক এবং কোডজেন ভিত্তিক বাস্তবায়ন উভয়ই। এটি পলিমার্ট টিম দ্বারা রচিত, সুতরাং এটি যতটা আমরা পেতে চলেছি ততই "অফিসিয়াল" এর কাছাকাছি।

বিকাশের সময়, এটি মিরর-ভিত্তিক এনকোডিং / ডিকোডিং ব্যবহার করবে; তবে প্রকাশের জন্য আপনি একটি ছোট ট্রান্সফর্মার তৈরি করতে পারেন যা কোড উত্পন্ন করবে।

শেঠ লাড এখানে একটি কোড নমুনা তৈরি করেছেন , যা আমি শিশু-অবজেক্টগুলিকে সমর্থন করার জন্য সামান্য বাড়িয়েছি :


আসলে তিনি নিজের বিল্ড_আরুনার প্লাগইন তৈরি করছেন না এবং সেখান থেকে তাকে অন্য রানার যেমন বিল্ড রানার স্ট্যাকিংয়ের মতো চালানো দরকার।
পার্থ ডেভ

এটি অফ-টপিক। json_serializableএটি একটি উদাহরণ এবং কিছু হতে পারে
রামি রোসলেট

আমি কীভাবে ধূমপান গ্রন্থাগারটি ব্যবহার করা যায় তার একটি উদাহরণ
দিচ্ছিলাম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.