Εισαγωγή: Η ψευδαίσθηση της απλότητας Πιθανότατα ο τύπος ή Στην επιφάνεια, αυτές οι εντολές αισθάνονται σχεδόν μαγικές: πατάτε το πλήκτρο Enter και ξαφνικά ο κώδικας σας συντάσσεται, συνδέεται και - μερικές φορές - εκτελείται. αλλά κάτω από αυτή την απλότητα βρίσκεται ένα προσεκτικά οργανωμένο σύστημα, βελτιστοποιημένο για να κάνει τη ζωή σας ως προγραμματιστής ευκολότερη ενώ είναι επίσης γρήγορο και προβλέψιμο για τις μηχανές. go build go run Η κατανόηση του πώς το Go χειρίζεται την κατασκευή, την εκτέλεση και την αποθήκευση κώδικα δεν είναι απλώς μια ακαδημαϊκή άσκηση. Εξηγεί γιατί οι εντατικές κατασκευές είναι τόσο γρήγορες, γιατί οι αγωγοί CI συμπεριφέρονται με συνέπεια και γιατί μερικές φορές μια φαινομενικά ασήμαντη αλλαγή μπορεί να προκαλέσει πλήρη ανασύνταξη. Στο τέλος θα έχετε μια ξεκάθαρη εικόνα: πώς το Go επιλύει εξαρτήσεις και δομές του κώδικα σας σε πακέτα, πώς η συλλογή και η σύνδεση λειτουργεί πίσω από τις σκηνές, Γιατί είναι τόσο αξιόπιστο το build cache; Τι συμβαίνει πραγματικά όταν πληκτρολογείτε go build ή go run. Εάν αναρωτιέστε ποτέ γιατί το Go δημιουργεί "μόνο εργασία" ή γιατί η προσωρινή Οι δυαδικές εικόνες φαίνονται σχεδόν στιγμιαίες, αυτή είναι η βαθιά κατάδυση που συνδέει τα σημεία - τόσο για τους ανθρώπους όσο και για τις μηχανές. go run Το ψυχολογικό μοντέλο του Go Toolchain Με την πρώτη ματιά, , , and μοιάζουν με ξεχωριστές εντολές, καθεμιά με τη δική της συμπεριφορά. στην πραγματικότητα, είναι απλώς frontend για Κάθε εντολή Go περνά μέσα από μια προβλέψιμη ακολουθία: φορτώνει ενότητες, επιλύει εξαρτήσεις πακέτων, συντάσσει πακέτα, προαιρετικά τα συνδέει σε ένα εκτελέσιμο και μερικές φορές εκτελεί το αποτέλεσμα. Όχι η μηχανική της κατασκευής. go build go run go test same underlying pipeline what happens to the final artifact Μια βασική έννοια της εσωτερικοποίησης είναι ότι Κάθε αρχείο .go σε ένα πακέτο αντιμετωπίζεται συλλογικά, και το ίδιο το πακέτο είναι η μονάδα που ο συντάκτης και χτίζει το cache track. Go builds packages, not individual files Η τροποποίηση οποιουδήποτε μεμονωμένου αρχείου σε ένα πακέτο μπορεί να προκαλέσει ανακατασκευή ολόκληρου του πακέτου. Τα πακέτα γίνονται τα φυσικά όρια για την προσωρινή αποθήκευση και την παράλληλη συλλογή. Τα μικρά, εστιασμένα πακέτα τείνουν να κλιμακώνονται καλύτερα σε μεγάλες βάσεις κώδικα, επειδή ο μεταγλωττιστής μπορεί να επαναχρησιμοποιήσει περισσότερα αποτελέσματα σε προσωρινή μνήμη. Ο αγωγός είναι εννοιολογικά απλός, αλλά εξαιρετικά βελτιστοποιημένος: Η Go γνωρίζει ακριβώς τι χρειάζεται ανασύνταξη και τι μπορεί να επαναχρησιμοποιηθεί, γι 'αυτό οι εντατικές κατασκευές αισθάνονται σχεδόν στιγμιαίες. Οργανώνει τη συλλογή, τη σύνδεση, την προσωρινή αποθήκευση και την εκτέλεση, οπότε σπάνια χρειάζεται να ανησυχείτε για τις λεπτομέρειες. και Σταματάει να αισθάνεται σαν μαγεία και αρχίζει να κάνει προβλέψιμη αίσθηση. smart coordinator go build go run από Δύο σχέδια οικοδόμησης ΠΡΟΣΟΧΗ ΠΡΟΣΟΧΗ Πριν το Go αγγίξει ποτέ τα αρχεία προέλευσης, πρέπει να καταλάβει τι να δημιουργήσει και με ποια σειρά. και Τα αρχεία αυτά καθορίζουν την , το οποίο είναι το πλήρες δέντρο εξάρτησης του έργου σας, μαζί με ακριβείς εκδόσεις για κάθε ενότητα.Με την ανάγνωση αυτών των αρχείων, η αλυσίδα εργαλείων Go γνωρίζει ακριβώς ποια πακέτα είναι μέρος της δημιουργίας σας και ποιος εξωτερικός κώδικας να ανακτήσει, να επαληθεύσει και να ενσωματώσει. go.mod go.sum module graph Μόλις φορτωθεί το γράφημα της ενότητας, το Go αξιολογεί κάθε πακέτο για να καθορίσει το σύνολο πηγής του. Αυτό περιλαμβάνει κάθε αρχείο .go που ανήκει στο πακέτο, φιλτραρισμένο από ετικέτες κατασκευής, λειτουργικό σύστημα, αρχιτεκτονική και τυχόν περιορισμούς που έχετε καθορίσει. Μόνο μετά από αυτή την αξιολόγηση ο μεταγλωττιστής γνωρίζει ποιο κώδικα χρειάζεται πραγματικά να επεξεργαστεί. Η εκτέλεση εντολών σε διαφορετικές μηχανές παράγει πανομοιότυπα αποτελέσματα, υποθέτοντας τις ίδιες εκδόσεις ενοτήτων. go build Σημαντικό στοιχείο της σύγχρονης εποχής είναι ο ρόλος της Οδηγίες σε Αυτή η οδηγία δηλώνει την ελάχιστη έκδοση Go για την οποία έχει σχεδιαστεί η ενότητα.Επηρεάζει διάφορα χαρακτηριστικά της κατασκευής: τη σημασιολογία της γλώσσας, τη συμπεριφορά του μεταγλωττιστή και ακόμη και τη στατική ανάλυση. Οι οδηγίες, η σημασιολογία της γλώσσας, η συμπεριφορά του μεταγλωττιστή και οι έλεγχοι μπορεί να διαφέρουν - η αλυσίδα εργαλείων επιβάλλει αυτά κατά τη διάρκεια της σύνταξης. go go.mod go Μέχρι το τέλος αυτής της φάσης, το εργαλείο έχει μια Ξέρει ποια πακέτα να συντάξει, σε ποια ακολουθία και ποια αρχεία ανήκουν σε κάθε πακέτο.Με αυτές τις πληροφορίες στο χέρι, προχωρεί στο επόμενο βήμα: συντάσσοντας πακέτα και συνδέοντάς τα σε δυαδικά, σίγουρος ότι τίποτα δεν θα χαθεί ή δεν θα συντάξει λάθος. complete, ordered build plan Συγκέντρωση και σύνδεση στην πράξη Μόλις το Go έχει το σχέδιο κατασκευής από το σύστημα μονάδας, αρχίζει να μετατρέπει τον κώδικα σας σε κάτι που μπορεί να εκτελέσει το μηχάνημα. Αυτό συμβαίνει σε δύο ξεχωριστά στάδια: συλλογή και σύνδεση. Η κατανόηση αυτών των σταδίων είναι το κλειδί για να εκτιμήσετε γιατί οι κατασκευές Go είναι γρήγορες, καθοριστικές και επεκτάσιμες. Η συλλογή είναι ανά πακέτο Πήγαινε να συγκεντρώσεις Κάθε πακέτο - είτε είναι μέρος του έργου σας είτε μια εξωτερική εξάρτηση - αντιμετωπίζεται ως ανεξάρτητη μονάδα. Αυτό σημαίνει ότι αν ένα πακέτο δεν έχει αλλάξει από την τελευταία κατασκευή, το Go μπορεί να παραλείψει την επανασύνταξη του εντελώς, ακόμη και αν άλλα πακέτα που εξαρτώνται από αυτό ανακατασκευάζονται. one package at a time intermediate artifacts Η παράλληλη προσέγγιση είναι ένα άλλο πλεονέκτημα αυτής της προσέγγισης ανά πακέτο: δεδομένου ότι ο μεταγλωττιστής γνωρίζει το γράφημα εξάρτησης, μπορεί να συντάξει πολλά ανεξάρτητα πακέτα ταυτόχρονα, αξιοποιώντας πλήρως τις πολυ-πυρήνες CPU. Η σύνδεση είναι επιλεκτική είναι η διαδικασία του συνδυασμού συμπιεσμένων πακέτων σε ένα μόνο εκτελέσιμο. Τα πακέτα βιβλιοθήκης δεν συνδέονται ποτέ από μόνα τους, υπάρχουν καθαρά ως επαναχρησιμοποιήσιμα αντικείμενα για άλλα πακέτα. Σε ένα έργο, το Go μπορεί να συντάξει δεκάδες πακέτα, αλλά να παράγει μηδενικά δυαδικά εάν κανένα από τα πακέτα δεν είναι κύριο! Σύνδεση only links main packages into binaries go build ./... Η σύνδεση είναι συχνά το πιο δαπανηρό βήμα σε μια κατασκευή, επειδή περιλαμβάνει τον συνδυασμό όλων των εξαρτήσεων σε ένα ενιαίο εκτελέσιμο, την επίλυση συμβόλων και την ενσωμάτωση μεταδεδομένων. Τι τελειώνει στο δυαδικό Το τελικό δυαδικό είναι κάτι περισσότερο από τον κωδικό σας. Όλα τα εξαρτημένα πακέτα που είναι προσβάσιμα από το κύριο Δημιουργία μεταδεδομένων, συμπεριλαμβανομένης της έκδοσης της μονάδας και των πληροφοριών commit Οδηγίες σε επίπεδο μηχανής βελτιστοποιημένες για την πλατφόρμα-στόχο Αυτός ο συνδυασμός είναι ο λόγος για τον οποίο τα δυαδικά Go είναι αυτοπεριορισμένα και αναπαραγωγικά: περιλαμβάνουν όλα όσα χρειάζονται για να τρέξουν χωρίς να βασίζονται σε εξωτερικές βιβλιοθήκες ή περιβάλλοντα εκτέλεσης. Από ανθρώπινη άποψη, αυτό καθιστά την ανάπτυξη απλή. Από άποψη μηχανής, το σύστημα οικοδόμησης μπορεί να επαληθεύσει και να αποθηκεύσει αποτελεσματικά τα πάντα, εξασφαλίζοντας ότι οι επαναλαμβανόμενες οικοδομές είναι γρήγορες και καθοριστικές. The Build Cache: Το κέντρο της βαρύτητας Στην καρδιά της ταχύτητας και της προβλεψιμότητας του Go είναι η Κάθε επεξεργασμένο πακέτο, κάθε ενδιάμεσο αντικείμενο και ακόμη και μερικές εξόδους εργαλείων αποθηκεύονται σε μια προσωρινή μνήμη που απευθύνεται σε περιεχόμενο, η οποία επιτρέπει στο Go να επαναχρησιμοποιεί την εργασία σε όλες τις κατασκευές, τις εντολές και ακόμη και Η κατανόηση του τρόπου λειτουργίας της προσωρινής μνήμης είναι απαραίτητη για να κατανοήσουμε γιατί οι κατασκευές Go αισθάνονται σχεδόν στιγμιαίες, ακόμη και για μεγάλα έργα. build cache go run Τι είναι το Cache Stores Το Build Cache είναι κάτι περισσότερο από απλώς επεξεργασμένα δυαδικά. Συγκεντρωμένα αντικείμενα πακέτων (α αρχεία) για όλα τα πακέτα στο γράφημα κατασκευής Αποτελέσματα δοκιμών, συμπεριλαμβανομένων τροφοδοτούμενων πληροφοριών επιτυχίας Προσωρινές εξόδους εργαλείων που απαιτούνται για εκτέλεση με δοκιμή go run ή go Η προσωρινή μνήμη ζει στο δίσκο (κατά προεπιλογή σε ) και είναι πλήρως καθοριστικό, πράγμα που σημαίνει ότι το ίδιο πακέτο που συντάσσεται με τις ίδιες εισόδους θα παράγει πάντα την ίδια καταχώρηση cache. $GOCACHE Με βάση το περιεχόμενο, όχι με βάση το timestamp Σε αντίθεση με τα παραδοσιακά συστήματα οικοδόμησης που βασίζονται σε timestamps αρχείων, το Go χρησιμοποιεί to determine cache keys. Each cache key is a function of: content-based hashing Το περιεχόμενο του πηγαίου κώδικα Η εκδοχή του compiler Οποιοσδήποτε χτίζει σημαίες Η πλατφόρμα στόχου (GOOS/GOARCH) Σχετικές περιβαλλοντικές μεταβλητές Αυτός ο σχεδιασμός εγγυάται ότι οι κατασκευές είναι αναπαραγωγικές και αποφεύγει τις λανθασμένες παραλείψεις προσωρινής αποθήκευσης λόγω αβλαβών αλλαγών όπως timestamps ή σειρά αρχείων. Εξήγησε την αναπηρία Ακόμη και με μια ισχυρή προσωρινή μνήμη, το Go μπορεί μερικές φορές να επανασυντάσσει πακέτα. Τροποποίηση του πηγαίου κώδικα ή οικοδόμηση ετικετών Αλλαγή των σημαιών του μεταγλωττιστή ή των μεταβλητών περιβάλλοντος Ανακατεύθυνση αρχείων σε ένα πακέτο Το σύστημα προσωρινής αποθήκευσης του Go είναι έξυπνο: ανακατασκευάζει μόνο αυτό που χρειάζεται πραγματικά ανακατασκευή. Ακόμη και μικρές, μη σημασιολογικές αλλαγές μπορούν να προκαλέσουν ανασύνταξη εάν επηρεάσουν την κατασκευή του πακέτου, αλλά διαφορετικά, η προσωρινή αποθήκευση εμπιστεύεται σιωπηρά. Γιατί το cache είναι ασφαλές να εμπιστευτείτε Το build cache έχει σχεδιαστεί για να είναι διαφανές και αξιόπιστο: Σπάνια χρειάζεται να το καθαρίσετε χειροκίνητα Η ανακατασκευή από το μηδέν παράγει πανομοιότυπα αντικείμενα πηγαίνετε τρέξιμο, πηγαίνετε δοκιμή, και πηγαίνετε να χτίσετε όλη τη μόχλευση με συνέπεια Αυτός είναι ο λόγος για τον οποίο οι διαδοχικές κατασκευές του Go είναι τόσο γρήγορες: ο μεταγλωττιστής δεν κάνει ποτέ περισσότερη δουλειά από ό, τι είναι απαραίτητο. Από την άποψη του προγραμματιστή, αισθάνεται μαγικό. Από την άποψη των συστημάτων, είναι απλά ένας βελτιστοποιημένος αγωγός που αντιμετωπίζει τα αντικείμενα πακέτων ως πολίτες πρώτης τάξης. • Παραγωγή αντικειμένων go build Πήγαινε να χτίσεις Η εντολή go build είναι η εργαλειοθήκη της αλυσίδας εργαλείων Go. Η δουλειά της είναι απλή για να περιγραφεί αλλά εξελιγμένη στην εκτέλεση: Κατανοώντας τι Στην πραγματικότητα, σας βοηθά να προβλέψετε τη συμπεριφορά του και να αποφύγετε κοινές εκπλήξεις. compile packages, link them if necessary, and produce a binary that is correct and reproducible go build Πώς να δημιουργήσετε πακέτα χειρισμάτων Όταν τρέχεις σε μια ενότητα ή πακέτο, το εργαλείο εξετάζει πρώτα το γράφημα εξάρτησης που προέρχεται από το Κάθε πακέτο στο γράφημα ελέγχεται ενάντια στην προσωρινή μνήμη κατασκευής: εάν η προσωρινή μνήμη περιέχει ένα έγκυρο επεξεργασμένο αντικείμενο για ένα πακέτο, το Go το επαναχρησιμοποιεί αντί για επανασύνταξη. go build go.mod Επειδή πάει , αγγίζοντας ένα μόνο αρχείο μέσα σε ένα πακέτο μπορεί να προκαλέσει μια ανακατασκευή ολόκληρου του πακέτου. Αντίθετα, αν μια εξάρτηση δεν έχει αλλάξει, δεν ανακατασκευάζεται ποτέ, ακόμη και αν άλλα πακέτα βασίζονται σε αυτό. Μεγάλη επιτυχία, ακόμα και για μεγάλα έργα. operates at the package level incremental builds Σύνδεση και το τελικό δυαδικό Όπως αναφέρθηκε προηγουμένως, παράγει μόνο ένα εκτελέσιμο για τα κύρια πακέτα. Τα πακέτα βιβλιοθήκης συντάσσονται σε ενδιάμεσα αντικείμενα, αλλά ποτέ δεν συνδέονται από μόνα τους. Όταν συνδέετε ένα κύριο πακέτο, το Go συνδυάζει όλα τα πακέτα που έχουν συνδεθεί σε ένα ενιαίο δυαδικό. Αυτή η διαδικασία ενσωματώνει επίσης μεταδεδομένα στο εκτελέσιμο, συμπεριλαμβανομένων: go build Πληροφορίες έκδοσης module Επιλέξτε hashes (αν είναι διαθέσιμα) Πλατφόρμα-ειδικά κατασκευαστικά μεταδεδομένα Από προεπιλογή, η συμπερίληψη των λεπτομερειών ελέγχου εκδόσεων διέπεται από το σημαία, η οποία γίνεται από προεπιλογή σε "αυτόματη" και σφραγίζει τις πληροφορίες VCS όταν το πλαίσιο αποθετηρίου το επιτρέπει (χρησιμοποιήστε Να παραλείψουμε ή Περισσότερες λεπτομέρειες μπορείτε να βρείτε στην τεκμηρίωση . -buildvcs -buildvcs=false -buildvcs=true ΕΔΩ Αυτό καθιστά τα δυαδικά Go αυτοπεριορισμένα και εξαιρετικά αναπαραγωγικά, επιτρέποντάς σας να τα αναπτύξετε με αυτοπεποίθηση χωρίς να ανησυχείτε για την έλλειψη εξαρτήσεων. Πού πηγαίνουν τα αντικείμενα (Συγγνώμη 😀) Με την παράλειψη, γράφει το δυαδικό στον τρέχοντα κατάλογο, που ονομάζεται μετά το πακέτο. δεν παράγει καθόλου ένα δυαδικό, διασφαλίζει μόνο ότι το πακέτο και οι εξαρτήσεις του είναι συγκεντρωμένες. Σημαία ή χρήση Δημιουργία πολλαπλών πακέτων σε μία κίνηση. go build go build -o ./... Στα Windows, οι εκτελεστές έχουν ένα Όταν δημιουργείτε πολλά κύρια πακέτα ταυτόχρονα (για παράδειγμα, ) Χωρίς Το Go γράφει ένα δυαδικό ανά κύριο πακέτο στον τρέχοντα κατάλογο. .exe ./cmd/... -o Προβλέψιμα και αξιόπιστα κτίρια Ο συνδυασμός της συλλογής ανά πακέτο, της προσωρινής αποθήκευσης και της επιλεκτικής σύνδεσης εξασφαλίζει ότι το go build είναι προβλέψιμο. Οι κατασκευές μπορούν να αναπαραχθούν σε μηχανές Ο αμετάβλητος κώδικας δεν ξαναχτίζεται ποτέ άσκοπα. τα ενδιάμεσα αντικείμενα επαναχρησιμοποιούνται για τη βελτιστοποίηση του χρόνου κατασκευής Με λίγα λόγια, Δεν είναι μόνο η συλλογή κώδικα, είναι . go build orchestrating a deterministic pipeline that balances human convenience with machine efficiency ΕΥΚΟΡΙΑ ΧΩΡΙΣ ΕΙΔΙΚΑ ΠΡΟΟΡΙΣΜΑΤΑ go run Πάμε τρέξιμο Αν είναι το άλογο εργασίας που παράγει αντικείμενα που μπορείτε να αναπτύξετε, Πολλοί προγραμματιστές το σκέφτονται ως «σύνταξη και εκτέλεση σε ένα βήμα», αλλά δεν είναι: κάτω από το καπάκι, αξιοποιεί το ίδιο σύστημα κατασκευής όπως , είναι απλώς βελτιστοποιημένο για την ευκολία και όχι για την επιμονή των αντικειμένων. go build go run go build Τι Στην πραγματικότητα κάνει go run Όταν ο τύπος (ή μια λίστα αρχείων), το Go αξιολογεί πρώτα το πακέτο και τις εξαρτήσεις του ακριβώς όπως θα . Any cached compiled packages are reused, so the compiler does minimal work for unchanged code. Then, Go . go run main.go go build links the main package into a temporary binary, executes it, and deletes the binary once the program finishes Από την οπτική γωνία, Αυτό εξηγεί γιατί οι επαναλαμβανόμενες ανακλήσεις του ίδιου προγράμματος συχνά αισθάνονται στιγμιαίες: η βαριά ανύψωση έχει ήδη γίνει και μόνο η σύνδεση ή η αλλαγή των πακέτων μπορεί να προκαλέσει τη συλλογή. go run ΓΙΑΤΙ Αισθάνεται διαφορετικά go run Παρά το γεγονός ότι ο αγωγός έχει το ίδιο υπόβαθρο, μπορεί να αισθάνεται πιο αργή σε ορισμένα σενάρια. Επειδή παράγει ένα προσωρινό δυαδικό κάθε φορά, η σύνδεση επαναλαμβάνεται, ακόμη και αν όλες οι εξαρτήσεις είναι προσωρινά αποθηκευμένες. Για τα μικρά προγράμματα, αυτό το overhead είναι αμελητέο, αλλά για τα έργα με μεγάλα γραφήματα εξάρτησης, μπορεί να είναι αισθητό. go run Μια άλλη διαφορά είναι ότι Αυτό είναι ακριβώς το σημείο: διαπραγματεύεται δυαδική επαναχρησιμοποίηση για ευκολία εκτέλεσης. δεν χρειάζεται να σκεφτείτε πού να τοποθετήσετε το δυαδικό ή τι να το ονομάσετε, το εργαλείο το χειρίζεται αυτόματα. go run does not leave a persistent artifact Πότε Είναι το σωστό εργαλείο - και όταν δεν είναι go run Είναι ιδανικό για: go run Γρήγορα πειράματα ή σενάρια εκτέλεση προγραμμάτων χωρίς να διαταράσσεται το σύστημα αρχείων Δοκιμάστε μικρά προγράμματα διαδραστικά Είναι λιγότερο κατάλληλο για: Κατασκευές παραγωγής ή ανάπτυξη διακομιστές που εκτελούνται για μεγάλο χρονικό διάστημα, όπου η επαναλαμβανόμενη σύνδεση προσθέτει CI αγωγοί όπου η προσωρινή αποθήκευση των επίμονων δυαδικών είναι πιο αποτελεσματική For these cases, the recommended pattern is , το οποίο σας δίνει τα οφέλη της προσωρινής αποθήκευσης, της αναπαραγωγικότητας και ενός επίμονου αντικειμένου χωρίς να θυσιάζετε την απόδοση. go build && ./binary Η κρυμμένη ορθότητα go test Πηγαίνετε στην δοκιμή Η Το σύστημα βασίζεται στις ίδιες αρχές όπως και Η κατανόηση του τρόπου με τον οποίο οι δοκιμές αλληλεπιδρούν με το σύστημα οικοδόμησης βοηθά στην εξήγηση του γιατί ορισμένες δοκιμές εκτελούνται αμέσως ενώ άλλες ενεργοποιούν μια ανακατασκευή και γιατί η προσέγγιση του Go αισθάνεται τόσο γρήγορη όσο και προβλέψιμη. go test go build go run Επαναχρησιμοποίηση της συλλογής σε δοκιμές Όταν τρέχεις Το Go προσδιορίζει πρώτα το γράφημα εξάρτησης για το πακέτο δοκιμής, συμπεριλαμβανομένων τυχόν εισαγόμενων πακέτων. Όπως ακριβώς και με ή Αυτό σημαίνει ότι οι μεγάλες σουίτες δοκιμών μπορούν συχνά να αρχίσουν να εκτελούνται σχεδόν αμέσως, επειδή το μεγαλύτερο μέρος της εργασίας σύνταξης έχει ήδη γίνει. go test reused from the build cache go build go run Ακόμη και όταν εμπλέκονται πολλαπλά πακέτα, το Go ανακατασκευάζει μόνο τα πακέτα που έχουν πράγματι αλλάξει.Ο συνδυασμός της συλλογής ανά πακέτο και της προσωρινής αποθήκευσης εξασφαλίζει ότι οι εντατικές δοκιμές εκτελούνται γρήγορα, ακόμη και σε μεγάλα έργα. Αποτελέσματα δοκιμών caching Εκτός από την αποθήκευση συσκευασμένων πακέτων, το Εάν μια δοκιμή περάσει και καμία από τις εξαρτήσεις της ή οι σχετικές σημαίες δεν έχουν αλλάξει, το Go μπορεί να παραλείψει την εκ νέου εκτέλεση της δοκιμής εντελώς. caches test results Η προσωρινή αποθήκευση των αποτελεσμάτων δοκιμής ισχύει μόνο στη λειτουργία λίστας πακέτων (π.χ. ή ). σε τοπικό κατάλογο καταλόγου ( χωρίς πακέτο args), η προσωρινή μνήμη είναι απενεργοποιημένη. go test . go test ./... go test Η συμπεριφορά αυτή ελέγχεται από την Για παράδειγμα, η σημαία Ανεξάρτητα από τα αποτελέσματα της εκτέλεσης του προγράμματος. ( Επαναλάβετε τις δοκιμές / δείκτες αναφοράς. είναι ο γλωσσικός τρόπος για να παρακάμψετε τα προσωρινά αποτελέσματα. δείτε το Για περισσότερες λεπτομέρειες) -count go test -count=1 -count -count=1 τεκμηρίωση Η προσωρινή αποθήκευση των αποτελεσμάτων των δοκιμών βελτιώνει την παραγωγικότητα των προγραμματιστών και την αποτελεσματικότητα του CI, ειδικά για μεγάλα έργα με εκτεταμένη κάλυψη δοκιμών. . the system should avoid unnecessary work while preserving correctness Απαγόρευση ακυρότητας σε δοκιμές Μια δοκιμή μπορεί να επαναληφθεί αυτόματα εάν: Ο ίδιος ο κώδικας δοκιμών έχει αλλάξει. Κάθε εξάρτηση από τη δοκιμή έχει αλλάξει. Οι σημαίες που επηρεάζουν τη δοκιμή έχουν αλλάξει. Οι μη κρυπτογραφημένες σημαίες ή τα τροποποιημένα αρχεία/env επίσης ακυρώνουν την επαναχρησιμοποίηση. Διαφορετικά, το Go εμπιστεύεται το κρυφό αποτέλεσμα, γνωρίζοντας ότι είναι Αυτή η προσέγγιση μειώνει τις "φλασκές" κατασκευές που προκαλούνται από περιττές ανακατασκευές και δίνει έμφαση στην προβλεψιμότητα πάνω από την τυφλή ευκολία. deterministic and reproducible Ετικέτες Handy Snippets Εδώ είναι μερικά χρήσιμα Εφαρμογές που επηρεάζουν τη συμπεριφορά: go test Fresh run: go test -count=1 ./... - όπως είδαμε νωρίτερα, αυτό απενεργοποιεί την προσωρινή αποθήκευση των αποτελεσμάτων των δοκιμών. Στρες μια δοκιμή: πηγαίνετε δοκιμή -run '^TestFoo$' -count=100 ./pkg - εκτελεί TestFoo 100 φορές για να ελέγξετε για flakiness. Σταθερότητα τραπεζιού: πηγαίνετε δοκιμή -bench. -count=3 - εκτελεί όλα τα σημεία αναφοράς 3 φορές για να πάρει σταθερές μετρήσεις. Γιατί αυτό είναι σημαντικό για τους προγραμματιστές Από την άποψη ενός προγραμματιστή, ο συνδυασμός της προσωρινής αποθήκευσης κατασκευής και της προσωρινής αποθήκευσης των αποτελεσμάτων δοκιμών δημιουργεί μια ροή εργασίας που αισθάνεται άμεση και αξιόπιστη: Οι μικρές αλλαγές ενεργοποιούν μόνο τα απαραίτητα βήματα σύνταξης. Οι δοκιμές που περνούν σπάνια επαναλαμβάνονται, εκτός αν κάτι αλλάξει. Οι προγραμματιστές μπορούν να επαναλάβουν γρήγορα χωρίς να ανησυχούν για την κρυφή κατάσταση. Αντιμετωπίζοντας τόσο τα πακέτα όσο και τα αποτελέσματα των δοκιμών ως αντικείμενα προσωρινής αποθήκευσης πρώτης κατηγορίας, το Go καθιστά τις δοκιμές γρήγορες και προβλέψιμες, ενισχύοντας την ίδια βελτιστοποίηση «άνθρωπος + μηχανή» που στηρίζεται και . go build go run Παρακολούθηση και εκκαθάριση του συστήματος Build Τις περισσότερες φορές, το σύστημα οικοδόμησης του Go κάνει ακριβώς αυτό που περιμένετε, ήσυχα και αποτελεσματικά. Όταν κάτι σβήνει, ωστόσο, η αλυσίδα εργαλείων σας δίνει άμεση, χαμηλού επιπέδου ορατότητα σε αυτό που κάνει. Κάντε το Toolchain Talk Το Go παρέχει ένα μικρό σύνολο σημαιών που εκθέτουν τον αγωγό κατασκευής χωρίς να αλλάζει τη συμπεριφορά του: -x εκτυπώνει τις πραγματικές εντολές που εκτελούνται κατά τη διάρκεια της κατασκευής. Αυτό περιλαμβάνει ανακλήσεις του μεταγλωττιστή, βήματα σύνδεσης και εκτελέσεις εργαλείων. Είναι ο ταχύτερος τρόπος για να απαντήσετε στην ερώτηση: "Τι πραγματικά κάνει το Go τώρα;" Αυτό είναι χρήσιμο όταν θέλετε να κατανοήσετε το σχέδιο κατασκευής χωρίς να ενεργοποιήσετε μια ανακατασκευή. Η εργασία διατηρεί τον προσωρινό κατάλογο κατασκευής αντί να το διαγράψει.Αυτό σας επιτρέπει να ελέγξετε τα ενδιάμεσα αρχεία, τον παραγόμενο κώδικα και τα προσωρινά αντικείμενα που παράγονται κατά τη διάρκεια της σύνταξης ή της σύνδεσης. Αυτές οι σημαίες μετατρέπουν την αλυσίδα εργαλείων Go από ένα μαύρο κουτί σε έναν διαφανή αγωγό. Κατανοώντας γιατί ένα πακέτο ανακατασκευάστηκε Μία από τις πιο συνηθισμένες πηγές σύγχυσης είναι η ανοικοδόμηση του πακέτου «χωρίς προφανή λόγο».Με το σωστό ψυχικό μοντέλο, αυτό καθίσταται ευκολότερο να διαγνωστεί: Ένα πακέτο ανακατασκευάζεται όταν οποιαδήποτε εισαγωγή στο κλειδί προσωρινής αποθήκευσης αλλάζει. Οι εισροές περιλαμβάνουν τον πηγαίο κώδικα, τις ετικέτες κατασκευής, τις σημαίες του συντάκτη, την πλατφόρμα στόχου και τις σχετικές περιβαλλοντικές μεταβλητές. Οι αλλαγές εξάρτησης εξαπλώνονται προς τα πάνω μέσω του διαγράμματος πακέτου. Χρησιμοποιώντας , μπορείτε συχνά να δείτε αν το Go επαναχρησιμοποίησε ένα αντικείμενο σε προσωρινή μνήμη ή συνέταξε ένα πακέτο, και να συμπεράνουμε γιατί από το πλαίσιο. Ως πρώτη απάντηση. -x go clean -cache Αναγκαστική ανασυγκρότηση (όταν πραγματικά το εννοείς) Μερικές φορές θέλετε πραγματικά να παρακάμψετε την προσωρινή μνήμη. Για παράδειγμα, όταν επικυρώνετε μια καθαρή κατασκευή ή χειρίζεστε προβλήματα στην αλυσίδα εργαλείων. Μια ανασυγκρότηση πακέτων δυνάμεων, αγνοώντας τα αρχιτεκτονικά αντικείμενα που έχουν αποθηκευτεί σε προσωρινή μνήμη go clean - cache καθαρίζει ολόκληρο το cache κατασκευής Αυτές οι επιλογές είναι σκόπιμα ρητές και ελαφρώς ενοχλητικές. Το Go έχει σχεδιαστεί για να κάνει σωστή επαναχρησιμοποίηση της προεπιλογής και η μη αυτόματη ακύρωση της προσωρινής μνήμης είναι η εξαίρεση. Εάν βρείτε τον εαυτό σας καθαρίζοντας την προσωρινή μνήμη τακτικά, είναι συχνά ένα σημάδι ότι κάτι άλλο στη ρύθμιση του build χρειάζεται προσοχή. Αποφύγετε τις δεισιδαιμονίες Επειδή το σύστημα κατασκευής του Go είναι καθοριστικό, η μαρτυρία σπάνια βοηθά. , και σας δίνουν συγκεκριμένες αποδείξεις για το τι συμβαίνει, η οποία είναι σχεδόν πάντα αρκετή για να εξηγήσει την εκπληκτική συμπεριφορά. -x -n -work Μόλις το εμπιστευτείτε: Τα κτίρια είναι προσανατολισμένα στο περιεχόμενο, Τα πακέτα είναι η μονάδα εργασίας, και το cache είναι ασφαλές για επαναχρησιμοποίηση, Η αντιμετώπιση της συμπεριφοράς του build γίνεται θέμα παρατήρησης και όχι δοκιμής και σφάλματος. Συνέπειες για πραγματικά έργα Οι επιλογές σχεδιασμού πίσω από το σύστημα οικοδόμησης του Go δεν είναι τυχαίες. εμφανίζονται πιο ξεκάθαρα όταν προχωράτε πέρα από μικρά παραδείγματα και αρχίζετε να εργάζεστε σε πραγματικές βάσεις κώδικα: συνεχείς αγωγοί ολοκλήρωσης, μεγάλα αποθετήρια και ροές εργασίας που καθοδηγούνται από τον επεξεργαστή. αισθάνονται γρήγορα τοπικά είναι αυτό που κάνει Go κλίμακα τόσο καλά σε περιβάλλοντα παραγωγής. go build Ο αγωγός και η αναπαραγωγικότητα Η έμφαση του Go στις καθοριστικές, προσανατολισμένες στο περιεχόμενο κατασκευές το καθιστά ιδιαίτερα κατάλληλο για το CI. Επειδή οι εκροές κατασκευής προέρχονται εξ ολοκλήρου από το περιεχόμενο πηγής, τις εκδόσεις ενοτήτων και τη ρητή διαμόρφωση, οι κατασκευές CI συμπεριφέρονται με συνέπεια σε μηχανές και περιβάλλοντα. Αυτή η προβλεψιμότητα καθιστά επίσης το Go Builds εξαιρετικά φιλικό προς την προσωρινή μνήμη. Είτε χρησιμοποιείτε μια κοινή προσωρινή μνήμη κατασκευής, στρώματα εμπορευματοκιβωτίων ή απομακρυσμένη υποδομή προσωρινής μνήμης, το μοντέλο σύνταξης σε επίπεδο πακέτου του Go ταιριάζει φυσικά. Monorepos και μεγάλες βάσεις κωδικών Σε μεγάλα αποθετήρια, η προσωρινή μνήμη κατασκευής γίνεται όριο απόδοσης. Επειδή οι προσωρινές μνήμες Go συντάσσουν πακέτα ανεξάρτητα, μικρά, καλά καθορισμένα πακέτα μπορούν να επαναχρησιμοποιηθούν σε πολλές κατασκευές με ελάχιστη ανάλυση. Η αντίστροφη πλευρά είναι ότι τα υπερβολικά μεγάλα ή σφιχτά συνδεδεμένα πακέτα μπορούν να γίνουν εμπόδια. Μια μικρή αλλαγή σε ένα βαριά χρησιμοποιούμενο πακέτο μπορεί να ακυρώσει ένα μεγάλο μέρος της προσωρινής μνήμης, αυξάνοντας τους χρόνους κατασκευής σε ολόκληρο το αποθετήριο. Εκδόσεις, εργαλείο και αυτοματοποίηση Το ίδιο μοντέλο κατασκευής εξουσιοδοτεί το οικοσύστημα εργαλείων του Go. Οι επεξεργαστές κώδικα, οι διακομιστές γλώσσας, οι γεννήτριες κώδικα και οι γεννήτριες κώδικα βασίζονται όλοι στην ίδια κατανόηση του κώδικα σε επίπεδο πακέτου. Επειδή η αλυσίδα εργαλείων αποκαλύπτει έναν σαφή, καθοριστικό αγωγό κατασκευής, τα εργαλεία μπορούν να ενσωματωθούν βαθιά χωρίς να μαντέψουν ή να εφαρμόσουν τη λογική κατασκευής. Αυτός είναι ένας λόγος για τον οποίο το Go tooling αισθάνεται ασυνήθιστα συνεπές: οι επεξεργαστές και τα συστήματα CI βλέπουν τον κώδικα σας με τον ίδιο τρόπο που κάνει ο μεταγλωττιστής. Συμπέρασμα: Εμπιστευτείτε το μοντέλο Το σύστημα οικοδόμησης του Go επιτυγχάνει επειδή κάνει μια σαφή συμβιβασμό: βελτιστοποιεί για την προβλεψιμότητα πάνω από την ευφυΐα, και για την ρητή δομή πάνω από την σιωπηρή συμπεριφορά. Στην επιφάνεια, αυτό μοιάζει με απλότητα. Κάτω από αυτό, είναι ένας προσεκτικά σχεδιασμένος αγωγός που αντιμετωπίζει τα πακέτα ως μονάδα εργασίας, το περιεχόμενο ως πηγή αλήθειας και την προσωρινή αποθήκευση ως χαρακτηριστικό ορθότητας και όχι ως hack απόδοσης. Μόλις εσωτερικοποιήσετε αυτό το μοντέλο, πολλές καθημερινές συμπεριφορές αρχίζουν να έχουν νόημα.Οι κατασκευές είναι γρήγορες όχι επειδή το Go κάνει λιγότερη δουλειά, αλλά επειδή αποφεύγει να το κάνει. εργασία . αισθάνεται άνετα επειδή επαναχρησιμοποιεί την ίδια μηχανή όπως Η εκτέλεση των δοκιμών είναι αξιόπιστη επειδή τα αποτελέσματα των δοκιμών αποθηκεύονται σε cache χρησιμοποιώντας τους ίδιους καθοριστικούς κανόνες όπως τα συγκεντρωμένα πακέτα. Αδικαιολόγητα go run go build Για τους ανθρώπους, αυτό σημαίνει λιγότερες εκπλήξεις, ταχύτερους κύκλους ανατροφοδότησης και εργαλεία που συμπεριφέρονται με συνέπεια σε επεξεργαστές κώδικα, μηχανές και συστήματα CI. Για τις μηχανές, αυτό σημαίνει αναπαραγωγικές κατασκευές, αντικείμενα φιλικά προς την κρυφή μνήμη και ένα σύστημα που κλιμακώνεται φυσικά καθώς οι βάσεις κώδικα μεγαλώνουν. Εάν υπάρχει ένα takeaway, είναι αυτό: Το σύστημα οικοδόμησης του Go δεν είναι κάτι για να αγωνιστείτε ή να εργαστείτε γύρω από. Είναι ένα API από μόνο του - ένα που ανταμείβει την κατανόηση. Μόλις εμπιστευτείτε το μοντέλο, η αλυσίδα εργαλείων σταματά να αισθάνεται μαγική και αρχίζει να αισθάνεται αξιόπιστο, το οποίο είναι ακριβώς αυτό που θέλετε από την υποδομή που χτίζει τον κώδικα σας.