Αντιμετώπιση προβλημάτων κατασκευής ειδικά για τα Windows στο Flutter
Η ανάπτυξη εφαρμογών πολλαπλών πλατφορμών με το Flutter είναι συχνά απρόσκοπτη, αλλά η εμφάνιση σφαλμάτων για συγκεκριμένες πλατφόρμες μπορεί να είναι απογοητευτική. Μία από αυτές τις κοινές προκλήσεις συμβαίνει όταν προσπαθείτε να δημιουργήσετε μια εφαρμογή Flutter για Windows και αντιμετωπίζετε ένα σφάλμα CMake που σχετίζεται με "flutter_wrapper_plugin". Ενώ η εφαρμογή μπορεί να λειτουργεί τέλεια σε Android, iOS ή ακόμα και στον Ιστό, τα Windows μπορούν να παρουσιάσουν μοναδικά εμπόδια. 🖥️
Αυτό το ζήτημα παρουσιάζεται συγκεκριμένα με CMake, το οποίο είναι απαραίτητο για το χειρισμό διαμορφώσεων build σε εγγενείς εφαρμογές. Το CMake μας επιτρέπει να ορίσουμε τον τρόπο με τον οποίο θα πρέπει να χτίζεται η εφαρμογή σε διαφορετικές πλατφόρμες, αλλά μια απλή εσφαλμένη διαμόρφωση μπορεί να σταματήσει την πρόοδο. Εδώ, το μήνυμα σφάλματος υποδηλώνει ότι ο στόχος "flutter_wrapper_plugin" δεν αναγνωρίζεται από το CMake ως μέρος του έργου κατασκευής.
Για όποιον το έχει αντιμετωπίσει αυτό, είναι ένα περίπλοκο πρόβλημα: Γιατί ένας στόχος θα λειτουργεί απρόσκοπτα σε ορισμένες πλατφόρμες αλλά όχι στα Windows; Η βαθύτερη κατάδυση στη ρύθμιση συχνά αποκαλύπτει λεπτές αλλά εντυπωσιακές αποχρώσεις διαμόρφωσης. 🧩
Σε αυτό το άρθρο, θα εξετάσουμε την αντιμετώπιση προβλημάτων αυτών των σφαλμάτων CMake στο Flutter, θα διερευνήσουμε γιατί προκύπτουν αυτά τα ζητήματα ειδικά για τα Windows και θα παρέχουμε ενεργά βήματα για την ομαλή εκτέλεση της εφαρμογής σας σε όλες τις πλατφόρμες. Ας το αποκωδικοποιήσουμε μαζί!
Εντολή | Παράδειγμα χρήσης |
---|---|
TARGET | Αυτή η εντολή ελέγχει εάν ένας καθορισμένος στόχος, όπως το flutter_wrapper_plugin, έχει δημιουργηθεί στο έργο CMake. Βοηθά στην υπό όρους εφαρμογή ρυθμίσεων σε έναν στόχο μόνο εάν υπάρχει, αποφεύγοντας σφάλματα όταν ο στόχος δεν είναι διαθέσιμος. |
target_compile_features | Χρησιμοποιείται για τον ορισμό συγκεκριμένων χαρακτηριστικών μεταγλώττισης για έναν στόχο, όπως το cxx_std_14. Αυτό διασφαλίζει ότι ο κώδικας για έναν στόχο συμμορφώνεται με ένα καθορισμένο πρότυπο C++, κρίσιμο για τη συμβατότητα σε πλατφόρμες όπως τα Windows. |
set_target_properties | Αυτή η εντολή εκχωρεί ιδιότητες σε έναν στόχο. Για παράδειγμα, ο ορισμός της ιδιότητας CXX_STANDARD διασφαλίζει ότι ο στόχος ακολουθεί μια συγκεκριμένη έκδοση C++, η οποία μπορεί να επιλύσει ζητήματα συμβατότητας στην ανάπτυξη πολλαπλών πλατφορμών. |
target_link_libraries | Συνδέει εξωτερικές βιβλιοθήκες με έναν συγκεκριμένο στόχο, όπως το flutter στο flutter_wrapper_plugin. Αυτή η εντολή είναι απαραίτητη για την προσθήκη εξαρτήσεων που απαιτεί ο στόχος κατά τη διαδικασία δημιουργίας. |
add_library | Καθορίζει έναν νέο στόχο βιβλιοθήκης, όπως μια εικονική βιβλιοθήκη INTERFACE για το flutter_wrapper_plugin. Αυτό μπορεί να χρησιμοποιηθεί για την παράκαμψη σφαλμάτων ορίζοντας έναν στόχο προσθήκης που λείπει χωρίς την προσθήκη πραγματικού περιεχομένου βιβλιοθήκης. |
enable_testing | Ενεργοποιεί τις ενσωματωμένες δυνατότητες δοκιμών του CMake, οι οποίες είναι χρήσιμες κατά τον καθορισμό δοκιμών μονάδας για να διασφαλιστεί ότι κάθε βήμα διαμόρφωσης έχει λειτουργήσει όπως αναμένεται σε όλες τις πλατφόρμες. |
add_test | Καταχωρεί μια δοκιμή στη σουίτα δοκιμών του CMake, επιτρέποντάς σας να επαληθεύσετε εάν μια διαμόρφωση, όπως η παρουσία ενός στόχου, εφαρμόζεται σωστά. Μπορούν να εκτελεστούν δοκιμές για να διασφαλιστεί ότι οι ρυθμίσεις εφαρμόζονται με συνέπεια σε όλες τις πλατφόρμες. |
message(WARNING/FATAL_ERROR) | Εμφανίζει ένα μήνυμα προειδοποίησης ή θανατηφόρου σφάλματος εάν δεν πληρούνται ορισμένες προϋποθέσεις. Για παράδειγμα, εάν ένας στόχος όπως το flutter_wrapper_plugin δεν υπάρχει, μπορεί να προειδοποιήσει τον προγραμματιστή ή να σταματήσει την κατασκευή με ένα μοιραίο σφάλμα. |
file(WRITE/APPEND) | Επιτρέπει τη δημιουργία ή την προσάρτηση σε αρχεία μέσα στο CMake. Αυτή η εντολή χρησιμοποιείται για τη δυναμική εγγραφή σεναρίων, όπως check_target.cmake, για την επικύρωση διαμορφώσεων ή στόχων κατασκευής κατά τη διάρκεια της δοκιμής. |
if (WIN32) | Μια εντολή υπό όρους που εφαρμόζει συγκεκριμένες ρυθμίσεις μόνο στα Windows. Αυτό επιτρέπει διαμορφώσεις για συγκεκριμένες πλατφόρμες, κάτι που είναι ζωτικής σημασίας κατά τον χειρισμό μοναδικών απαιτήσεων έκδοσης των Windows χωρίς να επηρεάζονται άλλες πλατφόρμες. |
Αντιμετώπιση ζητημάτων στόχου CMake στο Flutter για εκδόσεις των Windows
Κατά την κατασκευή ενός Ταραχή εφαρμογή για Windows, μπορεί να προκύψει σφάλμα CMake εάν ο στόχος "flutter_wrapper_plugin" δεν αναγνωρίζεται από το έργο. Αυτός ο τύπος σφαλμάτων δεν είναι ασυνήθιστος, ειδικά σε περιβάλλοντα πολλαπλών πλατφορμών όπου οι στόχοι της συγκεκριμένης πλατφόρμας μερικές φορές συμπεριφέρονται διαφορετικά. Στις λύσεις που παρέχονται, χρησιμοποιούνται διάφορες τεχνικές για την παράκαμψη αυτού του ζητήματος, όπως ο έλεγχος εάν ο στόχος υπάρχει πριν ορίσετε ιδιότητες σε αυτόν. Η πρώτη προσέγγιση χρησιμοποιεί έναν έλεγχο υπό όρους, με την εντολή TARGET να επαληθεύει εάν υπάρχει το flutter_wrapper_plugin. Εάν ο στόχος δεν υπάρχει, εμφανίζεται ένα προειδοποιητικό μήνυμα για να αποφευχθεί η διακοπή της διαδικασίας κατασκευής. Αυτός ο προληπτικός έλεγχος εμποδίζει το CMake να επιχειρήσει να εφαρμόσει ρυθμίσεις σε έναν ανύπαρκτο στόχο και διασφαλίζει ότι η εφαρμογή μπορεί να μεταγλωττιστεί ακόμα στα Windows. ⚙️
Μια άλλη προσέγγιση αξιοποιεί μια λύση δημιουργώντας έναν εικονικό στόχο όταν λείπει το flutter_wrapper_plugin. Ορίζοντας μια βιβλιοθήκη μόνο για διεπαφή, η διαδικασία δημιουργίας μπορεί να συνεχιστεί χωρίς σφάλματα. Η εντολή add_library επιτρέπει στους προγραμματιστές να ορίσουν το flutter_wrapper_plugin ως βιβλιοθήκη διεπαφής, που σημαίνει ότι δεν περιέχει πραγματικό κώδικα, αλλά χρησιμεύει ως σύμβολο κράτησης θέσης. Αυτή η τεχνική είναι ιδιαίτερα χρήσιμη σε αρθρωτές κατασκευές, όπου δεν χρειάζεται κάθε στόχος πλήρη λειτουργικότητα σε κάθε πλατφόρμα. Ορίζοντας ελάχιστες ιδιότητες σε αυτόν τον στόχο διεπαφής, όπως cxx_std_14, το έργο μπορεί να προχωρήσει, διατηρώντας παράλληλα τη συμβατότητα στα Windows. Αυτή η λύση μπορεί να είναι σωτήρια όταν αντιμετωπίζετε συγκεκριμένες πλατφόρμες πρόσθετο ασυνέπειες. 🛠️
Η τρίτη προσέγγιση στοχεύει στην ακρίβεια με την εφαρμογή διαμορφώσεων μόνο στα Windows. Η χρήση του ελέγχου WIN32 διασφαλίζει ότι αυτές οι ρυθμίσεις περιορίζονται στις εκδόσεις των Windows, αποφεύγοντας πιθανά προβλήματα σε άλλες πλατφόρμες όπως το Android ή το iOS. Αυτό καθιστά τη λύση ευέλικτη για έργα πολλαπλών πλατφορμών, όπου οι διαμορφώσεις ειδικά για τα Windows δεν θα επηρεάσουν άλλες εκδόσεις. Μέσα σε αυτήν την υπό όρους, ελέγχουμε ξανά για flutter_wrapper_plugin και εφαρμόζουμε ρυθμίσεις μόνο εάν υπάρχουν. Αυτή η προσέγγιση είναι ιδιαίτερα χρήσιμη για τη διατήρηση καθαρών διαμορφώσεων σε διαφορετικά περιβάλλοντα, ειδικά σε έργα όπου ο κώδικας πρέπει να λειτουργεί απρόσκοπτα σε πολλά λειτουργικά συστήματα.
Τέλος, προστίθενται δοκιμές μονάδας για την επικύρωση της διαμόρφωσης. Με τις εντολές enable_testing και add_test, το CMake μπορεί να επιβεβαιώσει εάν ο στόχος είναι παρών πριν από την εφαρμογή διαμορφώσεων, ενεργώντας ως τελική προστασία. Συμπεριλαμβάνοντας ένα μικρό σενάριο, check_target.cmake, διασφαλίζουμε ότι υπάρχει το πρόσθετο, διαφορετικά εμφανίζεται ένα σφάλμα. Αυτή η ρύθμιση είναι ιδιαίτερα πολύτιμη για πολύπλοκα έργα, όπου μια αποτυχημένη διαμόρφωση στόχου μπορεί να δημιουργήσει ένα εφέ κυματισμού, σπάζοντας τη διαδικασία κατασκευής ή προκαλώντας απρόβλεπτη συμπεριφορά. Η εφαρμογή των δοκιμών εγγυάται μια πιο ομαλή, πιο αξιόπιστη διαδικασία κατασκευής, μειώνοντας την πιθανότητα απροσδόκητης εμφάνισης ζητημάτων που σχετίζονται με την πλατφόρμα. Αυτή η πολυεπίπεδη προσέγγιση για την επίλυση προβλημάτων βελτιώνει σταθερότητα σε διαφορετικές πλατφόρμες, παρέχοντας ισχυρή υποστήριξη για τις φιλοδοξίες του Flutter για πολλαπλές πλατφόρμες.
Επίλυση σφαλμάτων CMake Target σε Flutter Windows Builds
Προσέγγιση 1: Χρήση ελέγχων υπό όρους στο CMake
# Check if flutter_wrapper_plugin exists before applying settings
if (TARGET flutter_wrapper_plugin)
# Apply standard settings if the target is available
target_compile_features(flutter_wrapper_plugin PUBLIC cxx_std_14)
set_target_properties(flutter_wrapper_plugin PROPERTIES CXX_STANDARD 14)
target_link_libraries(flutter_wrapper_plugin PRIVATE flutter)
else()
message(WARNING "flutter_wrapper_plugin target not found. Skipping settings.")
endif()
# End of conditional target check
Εναλλακτική λύση για τη διαχείριση σφαλμάτων flutter_wrapper_plugin
Προσέγγιση 2: Δημιουργία εικονικού στόχου για πρόσθετο που λείπει
# Define a dummy target for flutter_wrapper_plugin to prevent CMake errors
if (NOT TARGET flutter_wrapper_plugin)
add_library(flutter_wrapper_plugin INTERFACE)
endif()
# Apply settings to flutter_wrapper_plugin if it exists or was just created
target_compile_features(flutter_wrapper_plugin INTERFACE cxx_std_14)
set_target_properties(flutter_wrapper_plugin PROPERTIES CXX_STANDARD 14)
target_link_libraries(flutter_wrapper_plugin INTERFACE flutter)
Διασφάλιση συμβατότητας Build σε όλες τις πλατφόρμες
Προσέγγιση 3: Απομόνωση της ρύθμισης παραμέτρων CMake για τα Windows
# Apply specific settings only for Windows builds
if (WIN32)
if (TARGET flutter_wrapper_plugin)
target_compile_features(flutter_wrapper_plugin PUBLIC cxx_std_14)
set_target_properties(flutter_wrapper_plugin PROPERTIES CXX_STANDARD 14)
target_link_libraries(flutter_wrapper_plugin PRIVATE flutter)
else()
message(WARNING "flutter_wrapper_plugin target missing on Windows")
endif()
endif()
Δοκιμή μονάδας για την εγκυρότητα διαμόρφωσης CMake
CMake: Δοκιμή μονάδας Διαμόρφωση Build των Windows
# Include testing module
enable_testing()
add_test(NAME FlutterPluginExists COMMAND cmake -P check_target.cmake)
# check_target.cmake script: validates if flutter_wrapper_plugin target exists
file(WRITE check_target.cmake "if (NOT TARGET flutter_wrapper_plugin)\n")
file(APPEND check_target.cmake " message(FATAL_ERROR 'flutter_wrapper_plugin not found')\n")
file(APPEND check_target.cmake "endif()\n")
Αντιμετώπιση προβλημάτων και βέλτιστες πρακτικές για σφάλματα CMake στο Flutter για Windows
Όταν εργάζεστε με Ταραχή για τη δημιουργία εφαρμογών των Windows, οι προγραμματιστές ενδέχεται να αντιμετωπίσουν σφάλματα CMake, ιδιαίτερα εάν η εγκατάσταση δεν είναι πλήρως συμβατή με τις απαιτήσεις κατασκευής των Windows. Αυτά τα σφάλματα, όπως το μήνυμα "Δεν είναι δυνατός ο καθορισμός των δυνατοτήτων μεταγλώττισης" για στόχους όπως π.χ flutter_wrapper_plugin, συχνά προέρχονται από διαφορές στις εξαρτήσεις της πλατφόρμας ή σε συγκεκριμένες διαμορφώσεις προσθηκών που χρησιμοποιεί το Flutter για περιβάλλοντα Windows. Η αντιμετώπιση αυτών των σφαλμάτων απαιτεί όχι μόνο καλή κατανόηση του τρόπου με τον οποίο το Flutter διασυνδέεται με τον εγγενή κώδικα, αλλά και γνώση του τρόπου προσαρμογής του CMakeLists.txt ώστε να χειρίζεται προσαρμογές για συγκεκριμένη πλατφόρμα.
Ένα ουσιαστικό μέρος της αντιμετώπισης προβλημάτων είναι η κατανόηση του τρόπου με τον οποίο είναι δομημένα τα πρόσθετα Flutter, καθώς είναι συνήθως γραμμένα τόσο σε Dart όσο και σε μητρικές γλώσσες, όπως η C++ για Windows. Για παράδειγμα, μια προσθήκη Flutter που δεν καθορίζει ρητά ορισμένους στόχους μπορεί να λειτουργεί σωστά σε Android ή iOS, όπου η διαχείριση των εξαρτήσεων γίνεται αυτόματα. Ωστόσο, στα Windows, το CMake αναμένει σαφείς ορισμούς στόχων για τη σωστή μεταγλώττιση των δυνατοτήτων και τη σύνδεση βιβλιοθηκών. Εάν λείπουν αυτοί οι ορισμοί, προκύπτουν σφάλματα. Απλές διορθώσεις, όπως η προσθήκη ελέγχων υπό όρους ή η δημιουργία στόχων κράτησης θέσης, μπορούν συχνά να επιλύσουν προβλήματα, επιτρέποντας στο CMake να δημιουργεί χωρίς διακοπές. 🔧
Για έργα που πρέπει να εκτελούνται σε πολλές πλατφόρμες, οι βέλτιστες πρακτικές περιλαμβάνουν τη δοκιμή του build σε περιβάλλοντα παρόμοια με τις πλατφόρμες ανάπτυξης. Η δημιουργία ξεχωριστής διαμόρφωσης CMake για Windows, ο καθορισμός συγκεκριμένων προτύπων μεταγλώττισης και η σύνταξη δοκιμών μονάδας για διαμορφώσεις CMake είναι όλα προληπτικά βήματα για τη διασφάλιση της σταθερότητας. Αυτή η διαδικασία μπορεί να μειώσει τα απροσδόκητα σφάλματα, να βελτιστοποιήσει τη διοχέτευση κατασκευής και να κάνει τη μετάβαση πιο ομαλή κατά την ανάπτυξη μιας εφαρμογής Flutter στα Windows.
Συνήθεις ερωτήσεις και απαντήσεις για την επίλυση σφαλμάτων Flutter CMake στα Windows
- Τι προκαλεί το σφάλμα "Δεν είναι δυνατός ο καθορισμός των χαρακτηριστικών μεταγλώττισης" στο Flutter;
- Αυτό το σφάλμα παρουσιάζεται όταν το CMake δεν μπορεί να αναγνωρίσει έναν συγκεκριμένο στόχο (π.χ. flutter_wrapper_plugin) ως μέρος της κατασκευής. Μπορεί να συμβεί εάν ο στόχος δεν έχει καθοριστεί σωστά για εκδόσεις των Windows, σε αντίθεση με τις ρυθμίσεις Android ή iOS.
- Πώς μπορώ να δημιουργήσω έναν στόχο κράτησης θέσης στο CMake;
- Χρήση add_library με ένα INTERFACE στόχος. Αυτό δημιουργεί ένα μη λειτουργικό σύμβολο κράτησης θέσης που επιτρέπει στο build να συνεχίσει χωρίς να χρειάζεται πραγματικός ορισμός βιβλιοθήκης.
- Γιατί το Flutter απαιτεί εκδόσεις CMake για Windows;
- Το CMake διαχειρίζεται τη διαδικασία δημιουργίας εγγενούς κώδικα, ο οποίος είναι απαραίτητος για τα πρόσθετα Flutter στα Windows. Χωρίς αυτό, δεν μπορείτε να καθορίσετε λειτουργίες μεταγλώττισης ή να συνδέσετε βιβλιοθήκες αποτελεσματικά για εξαρτήσεις ειδικά για Windows.
- Υπάρχει τρόπος να περιοριστούν ορισμένες ρυθμίσεις μόνο σε εκδόσεις των Windows;
- Ναι, μπορείτε να χρησιμοποιήσετε το if (WIN32) υπό όρους στο CMakeLists.txt για την απομόνωση διαμορφώσεων σε περιβάλλοντα Windows, αποφεύγοντας τις διενέξεις μεταξύ πλατφορμών.
- Μπορώ να εκτελέσω μια έκδοση Flutter Windows χωρίς να τροποποιήσω το CMakeLists.txt;
- Εξαρτάται. Εάν οι στόχοι της προσθήκης έχουν καθοριστεί σωστά, μπορεί να λειτουργήσει, αλλά συχνά απαιτούνται διαμορφώσεις για συγκεκριμένες πλατφόρμες, επομένως η τροποποίηση του CMakeLists.txt διασφαλίζει πιο αξιόπιστη συμβατότητα.
- Τι κάνει target_compile_features κάνω;
- Αυτή η εντολή ορίζει το πρότυπο C++ για έναν στόχο (π.χ. cxx_std_14), το οποίο είναι ζωτικής σημασίας για τη διασφάλιση ότι λειτουργίες όπως οι βιβλιοθήκες είναι συμβατές με τον μεταγλωττιστή της πλατφόρμας.
- Πώς μπορώ να επαληθεύσω εάν υπάρχει ένας στόχος στο CMake;
- Ο TARGET Η εντολή μπορεί να ελέγξει εάν έχει οριστεί ένας στόχος πριν από την εφαρμογή ρυθμίσεων. Αυτό αποτρέπει τα σφάλματα παρακάμπτοντας τις διαμορφώσεις για στόχους που λείπουν.
- Υπάρχει τρόπος εκτέλεσης δοκιμών σε διαμορφώσεις CMake;
- Ναι, με τη χρήση enable_testing και add_test, μπορείτε να ρυθμίσετε δοκιμές μονάδων για να επικυρώσετε ότι οι στόχοι όπως flutter_wrapper_plugin υπάρχουν, εξασφαλίζοντας σταθερότητα κατασκευής.
- Μπορώ να χρησιμοποιήσω την ίδια διαμόρφωση CMake σε όλες τις πλατφόρμες;
- Όχι συνήθως, καθώς κάθε πλατφόρμα έχει μοναδικές απαιτήσεις. Χρησιμοποιώντας συνθήκες όπως if (WIN32) βοηθά στην εφαρμογή ρυθμίσεων για συγκεκριμένη πλατφόρμα χωρίς να διαταράσσονται άλλες εκδόσεις.
- Τι πρέπει να κάνω εάν η κατασκευή αποτύχει παρά τον καθορισμό στόχων;
- Ελέγξτε εάν όλες οι εξαρτήσεις συνδέονται σωστά target_link_libraries. Μερικές φορές, οι βιβλιοθήκες που λείπουν εμποδίζουν τη σωστή κατασκευή του στόχου.
Αντιμετώπιση προκλήσεων κατασκευής συγκεκριμένων πλατφόρμας στο Flutter
Η επίλυση σφαλμάτων CMake στο Flutter, ειδικά για Windows, απαιτεί προληπτικές λύσεις. Οι έλεγχοι υπό όρους και οι εικονικοί στόχοι είναι βασικές στρατηγικές για την αποφυγή διακοπών κατασκευής. Αυτά τα βήματα διασφαλίζουν ότι κάθε στόχος είναι καλά καθορισμένος και συμβατός με τις απαιτήσεις της πλατφόρμας.
Μέσω δοκιμών και διαμορφώσεων για συγκεκριμένες πλατφόρμες, οι προγραμματιστές μπορούν να ενισχύσουν τα έργα τους μεταξύ πλατφορμών, ελαχιστοποιώντας τα σφάλματα και ενισχύοντας τη σταθερότητα της διαδικασίας κατασκευής. Αυτές οι τεχνικές κάνουν τελικά τις εκδόσεις των Windows στο Flutter πιο αποτελεσματικές και αξιόπιστες, διασφαλίζοντας μια πιο ομαλή διαδρομή ανάπτυξης. 🛠️
Αναφορές και περαιτέρω ανάγνωση για την αντιμετώπιση προβλημάτων CMake Errors στο Flutter
- Λεπτομερείς οδηγίες για την επίλυση προβλημάτων διαμόρφωσης του CMake και ρύθμισης πρόσθετων στο Flutter μπορείτε να βρείτε στη διεύθυνση Οδηγός ανάπτυξης Flutter Windows .
- Για ολοκληρωμένη τεκμηρίωση σχετικά με τις εντολές CMake και τις επιλογές διαμόρφωσης build, ανατρέξτε στο Επίσημη τεκμηρίωση CMake .
- Κοινές πρακτικές αντιμετώπισης προβλημάτων και πληροφορίες κοινότητας για εκδόσεις Flutter μεταξύ πλατφορμών, συμπεριλαμβανομένων λύσεων ειδικά για Windows, είναι διαθέσιμες στο Υπερχείλιση στοίβας .
- Πληροφορίες σχετικά με τον χειρισμό στόχων συγκεκριμένης πλατφόρμας σε έργα Flutter παρέχονται στο Flutter Community Medium Blog .