Ένα αυξητικό εργαλείο δόμησης έργου είναι ένα αντικείμενο το οποίο χειρίζεται τους πόρους ενός έργου με συγκεκριμένο τρόπο. Τα αυξητικά εργαλεία δόμησης έργου χρησιμοποιούνται συχνά για την εφαρμογή μετασχηματισμού σε κάποιον πόρο με σκοπό τη δημιουργία ενός άλλου είδους πόρου ή τεχνουργήματος. Οι πόροι που έχουν δημιουργηθεί με ένα εργαλείο δόμησης σημειώνονται συνήθως ως παράγωγοι πόροι.
Οι πρόσθετες λειτουργίες συνεισφέρουν αυξητικά εργαλεία δόμησης έργου στην πλατφόρμα προκειμένου να υλοποιήσουν εξειδικευμένους μετασχηματισμούς πόρου. Για παράδειγμα, τα εργαλεία ανάπτυξης Java (JDT) καθορίζουν ένα αυξητικό εργαλείο δόμησης έργου το οποίο μεταγλωττίζει ένα αρχείο πρωτογενούς κώδικα Java μέσα σε ένα αρχείο κλάσης, οποτεδήποτε προστίθεται ή τροποποιείται ένα αρχείο έργου Java. Επίσης παρακολουθεί τα αρχεία εξάρτησης και τα αναμεταγλωττίζει όταν χρειάζεται.
Από την άποψη ενός API, η πλατφόρμα καθορίζει δύο βασικά είδη δόμησης:
Οι αυξητικές διεργασίες δόμησης συνοδεύονται από τροποποιημένα στοιχεία πόρου αλλαγής. Τα τροποποιημενα στοιχεία αντιπροσωπεύουν το καθαρό αποτέλεσμα όλων των αλλαγών πόρου από την τελευταία διεργασία δόμησης που πραγματοποιήθηκε από το εργαλείο δόμησης. Αυτά τα τροποποιημένα στοιχεία είναι παρόμοια με αυτά που χρησιμοποιούνται μέσα στα συμβάντα αλλαγής πόρου.
Η περιοδική εκκαθάριση των έργων είναι δυνατή από το χρήστη προκειμένου να προκαλέσει την αναδόμηση ενός πλήρους έργου την επόμενη φορά που κάποια αυξητική διεργασία δόμησης εκτελείται στο συγκεκριμένο έργο. Η εκκαθάριση ενός έργου αφαιρεί τις πληροφορίες δόμησης όπως οι προβληματικοί δείκτες και τα αρχεία κλάσης.
Τα εργαλεία δόμησης γίνονται ευκολότερα κατανοητά με τη χρήση παραδειγμάτων. Ο μεταγλωττιστής Java JDT καθοδηγείται από ένα αυξητικό εργαλείο δόμησης έργου το οποίο αναμεταγλωττίζει τα αρχεία ενός έργου που επηρεάζονται από τις αλλαγές. Κατά την αυτόματη ενεργοποίηση μιας πλήρους δόμησης, (ή την αυξητική δόμηση μετά από εκκαθάριση), γίνεται μεταγλώττιση σε όλα τα αρχεία .java του συγκεκριμένου έργου. Τυχόν προβλήματα μεταγλώττισης τα οποία συναντάτε, προστίθενται ως δείκτες προβλήματος των επηρεαζόμενων αρχείων .java. Κατά την αυτόματη ενεργοποίηση μιας αυξητικής διεργασίας δόμησης, το εργαλείο δόμησης αναμεταγλωττίζει τα αρχεία .java τα οποία προστίθενται, αλλάζουν ή επηρεάζονται και τα οποία περιγράφονται στα τροποποιημένα στοιχεία πόρου και ενημερώνει τους δείκτες προβλήματος ανάλογα με τις ανάγκες. Οποιαδήποτε αρχεία ή δείκτες .class που κρίνονται ως μη-κατάλληλα, αφαιρούνται.
Η αυξητική δόμηση έχει προφανή πλεονεκτήματα απόδοσης για έργα με εκατοντάδες ή χιλιάδες πόρους, η πλειονότητα των οποίων παραμένει αμετάβλητη σε οποιαδήποτε δεδομένη χρονική στιγμή.
Η τεχνική πρόκληση που χαρακτηρίζει την αυξητική δόμηση είναι ο ακριβής καθορισμός των στοιχείων που πρέπει να αναδομηθούν. Για παράδειγμα, η εσωτερική κατάσταση που διατηρείται από το εργαλείο δόμησης Java περιλαμβάνει στοιχεία όπως ένα γράφημα εξάρτησης και μια λίστα με τα αναφερόμενα προβλήματα μεταγλώττισης. Οι πληροφορίες αυτές χρησιμοποιούνται κατά τη διάρκεια μιας αυξητικής δόμησης για την αναγνώριση των κλάσεων που θα πρέπει να αναμεταγλωττιστούν σε απάντηση μιας αλλαγής που πραγματοποιήθηκε σε κάποιο πόρο Java.
Αν και η βασική δομή δόμησης καθορίζεται στην πλατφόρμα, η πραγματική εργασία πραγματοποιείται στον κώδικα του εργαλείου δόμησης. Τα μοτίβα υλοποίησης σύνθετης αυξητικής δόμησης δεν καλύπτονται στο σύνολό τους στο παρόν άρθρο, δεδομένου ότι η υλοποίηση εξαρτάται από τον ειδικό σχεδιασμό του εργαλείου δόμησης.
Η ρητή κλήση ενός εργαλείου δόμησης είναι δυνατή με έναν από τους παρακάτω τρόπους:
Στην πράξη, ο χρήστης του πάγκου εργασίας ενεργοποιεί αυτόματα μια δόμηση επιλέγοντας τις αντίστοιχες εντολές από το μενού της λειτουργίας πλοήγησης πόρου.
Η ρητή κλήση των αυξητικών εργαλείων δόμησης έργου από την πλατφόρμα είναι επίσης δυνατή κατά τη διάρκεια μιας αυτόματης δόμησης. Αν ενεργοποιηθούν, οι αυτόματες δομήσεις εκτελούνται οποτεδήποτε πραγματοποιούνται αλλαγές στο χώρο εργασίας.
Το σημείο επέκτασης org.eclipse.core.resources.builders χρησιμοποιείται για τη συνεισφορά ενός αυξητικού εργαλείου δόμησης έργου στην πλατφόρμα. Η ακόλουθη σήμανση δείχνει τον τρόπο με τον οποίο η υποθετική πρόσθετη λειτουργία com.example.builders θα μπορούσε να συνεισφέρει σε ένα αυξητικό εργαλείο δόμησης έργου.
<extension id="mybuilder" name="My Sample Builder" point="org.eclipse.core.resources.builders"> <builder <run class="com.example.builders.BuilderExample"> <parameter name="optimize" value="true" /> <parameter name="comment" value="Builder comment" /> </run> </builder> </extension>
Η κλάση η οποία αναγνωρίζεται στο σημείο επέκτασης πρέπει να επεκτείνει την κλάση της πλατφόρμας IncrementalProjectBuilder.
public class BuilderExample extends IncrementalProjectBuilder { IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException { // add your build logic here return null; } protected void startupOnInitialize() { // add builder init logic here } protected void clean(IProgressMonitor monitor) { // add builder clean logic here } }
Η επεξεργασία της δόμησης ξεκινά με τη μέθοδο build(), που περιλαμβάνει πληροφορίες σχετικά με το είδος της δόμησης για την οποία έχει υποβληθεί αίτηση. Η διεργασία δόμησης έχει μία από τις ακόλουθες τιμές:
Αν έχει υποβληθεί αίτηση για μια αυξητική δόμηση, παρέχονται τροποποιημένα στοιχεία πόρου προκειμένου να περιγράψουν τις αλλαγές που έγιναν στους πόρους από την τελευταία δόμηση. Το ακόλουθο τμήμα κώδικα βελτιώνει περαιτέρω τη μέθοδο build() .
protected IProject[] build(int kind, Map args, IProgressMonitor monitor throws CoreException { if (kind == IncrementalProjectBuilder.FULL_BUILD) { fullBuild(monitor); } else { IResourceDelta delta = getDelta(getProject()); if (delta == null) { fullBuild(monitor); } else { incrementalBuild(delta, monitor); } } return null; }
Ορισμένες φορές ενδέχεται κατά τη δόμηση ενό έργου "X," το εργαλείο δόμησης να χρειάζεται πληροφορίες σχετικά με τις αλλαγές σε κάποιο άλλο έργο "Y." (Για παράδειγμα, αν η κλάση Java στο έργο X υλοποιεί μια διασύνδεση η οποία παρέχεται στο έργο Y.) Κατά τη δόμηση του X, καλώντας το getDelta(Y) διατίθενται τροποποιημένα στοιχεία για το Y. Για να βεβαιωθείτε ότι η πλατφόρμα μπορεί να παρέχει τέτοια τροποποιημένα στοιχεία, το εργαλείο δόμησης X πρέπει να έχει δηλώσει την εξάρτηση μεταξύ του X και Y επιστρέφοντας έναν πίνακα που περιέχει το Y από μια προηγούμενη κλήση build(). Εάν κάποιο εργαλείο δόμησης δεν έχει εξαρτήσεις, μπορεί απλά να επιστρέψει την τιμή null. Για περισσότερες πληροφορίες, δείτε την ενότητα IncrementalProjectBuilder.
Η απαιτούμενη λογική για την επεξεργασία μια αίτησης πλήρους δόμησης σχετίζεται με την πρόσθετη λειτουργία. Ενδέχεται να προϋποθέτει την επίσκεψη κάθε πόρου του έργου ή ακόμα και την εξέταση άλλων έργων εάν υπάρχουν εξαρτήσεις μεταξύ των έργων. Το τμήμα κώδικα που ακολουθεί παρουσιάζει τον προτιμώμενο τρόπο υλοποίησης μιας πλήρους δόμησης.
protected void fullBuild(final IProgressMonitor monitor) throws CoreException { try { getProject().accept(new MyBuildVisitor()); } catch (CoreException e) { } }
Ο επισκέπτης της δόμησης θα πρέπει να εκτελεί τη δόμηση για το συγκεκριμένο πόρο (και να απαντά με την τιμή true προκειμένου να συνεχίσει να επισκέπτεται τους άλλους θυγατρικούς πόρους).
class MyBuildVisitor implements IResourceVisitor { public boolean visit(IResource res) { //build the specified resource. //return true to continue visiting children. return true; } }
Η διαδικασία επίσκεψης συνεχίζεται μέχρις ότου ολοκληρωθεί η πλοήγηση στην πλήρη διακλάδωση πόρου.
Κατά την εκτέλεση μιας αυξητικής δόμησης, το εργαλείο δόμησης λειτουργεί με τροποποιημένα στοιχεία αλλαγής μιας πλήρους διακλάδωσης πόρου.
protected void incrementalBuild(IResourceDelta delta, IProgressMonitor monitor) throws CoreException { // the visitor does the work. delta.accept(new MyBuildDeltaVisitor()); }
Η διαδικασία επίσκεψης συνεχίζεται μέχρις ότου ολοκληρωθεί η πλοήγηση στην πλήρη διακλάδωση των τροποποιημένων στοιχείων πόρου. Ο ειδικός χαρακτήρας των αλλαγών είναι παρόμοιος με αυτόν που περιγράφεται στην ενότητα Υλοποίηση μιας λειτουργίας ακρόασης αλλαγής πόρου. Μια σημαντική διαφορά είναι ότι με τα αυξητικά εργαλεία δόμησης έργου, εργάζεστε με τροποποιημένα στοιχεία τα οποία βασίζονται σε ένα συγκεκριμένο έργο, και όχι στο σύνολο του χώρου εργασίας.
Ο πάγκος εργασίας επιτρέπει στους χρήστες να κάνουν εκκαθάριση σε ένα έργο ή σύνολο έργων πριν από την εκκίνηση της δόμησης. Αυτή η λειτουργία επιτρέπει στο χρήστη να ενεργοποιήσει μια αναδόμηση από την αρχή μόνο σε ορισμένα έργα. Τα εργαλεία δόμησης υλοποιούν αυτή τη μέθοδο για να κάνουν εκκαθάριση οποιουδήποτε δείκτη προβλήματος και των παράγωγων πόρων στο έργο.
Για να καταστήσετε διαθέσιμο ένα εργαλείο δόμησης για κάποιο συγκεκριμένο έργο, πρέπει αυτό να περιλαμβάνεται στη δόμηση που αφορά το συγκεκριμένο έργο. Οι προδιαγραφές δόμησης έργου είναι μια λίστα εντολών προς διαδοχική εκτέλεση, μετά τη δόμηση του έργου. Κάθε εντολή προσδιορίζει ονομαστικά ένα μεμονωμένο αυξητικό εργαλείο δόμησης έργου.
ΣΗΜΕΙΩΣΗ: Το όνομα του εργαλείου δόμησης σε μια εντολή δόμησης αποτελεί την πλήρη ταυτότητα επέκτασης του εργαλείου δόμησης. Η πλήρης ταυτότητα μιας επέκτασης δημιουργείται από το συνδυασμό της ταυτότητας της πρόσθετης λειτουργίας με την απλή ταυτότητα επέκτασης στο αρχείο xml της πρόσθετης λειτουργίας. Για παράδειγμα, ένα εργαλείο δόμησης με απλή ταυτότητα επέκτασης "mybuilder" στην πρόσθετη λειτουργία "com.example.builders" θα είχε το όνομα "com.example.builders.mybuilder"
Το ακόλουθο τμήμα κώδικα προσθέτει ένα νέο εργαλείο δόμησης ως το πρώτο εργαλείο δόμησης στην υπάρχουσα λίστα εργαλείων δόμησης.
final String BUILDER_ID = "com.example.builders.mybuilder"; IProjectDescription desc = project.getDescription(); ICommand[] commands = desc.getBuildSpec(); boolean found = false; for (int i = 0; i < commands.length; ++i) { if (commands[i].getBuilderName().equals(BUILDER_ID)) { found = true; break; } } if (!found) { //add builder to project ICommand command = desc.newCommand(); command.setBuilderName(BUILDER_ID); ICommand[] newCommands = new ICommand[commands.length + 1]; // Add it before other builders. System.arraycopy(commands, 0, newCommands, 1, commands.length); newCommands[0] = command; desc.setBuildSpec(newCommands); project.setDescription(desc, null); }
Η ρύθμιση ενός εργαλείου δόμησης έργου πραγματοποιείται μόνο μια φορά, συνήθως κατά τη δημιουργία του έργου. Ένας συνηθισμένος τρόπος συσχετισμού ενός εργαλείου δόμησης με ένα έργο είναι ρυθμίζοντας μια φύση έργου.