Συμβουλές χρήσης του Composer
Το Composer είναι ένα εργαλείο για τη διαχείριση εξαρτήσεων στην PHP. Σας επιτρέπει να δηλώσετε τις βιβλιοθήκες από τις οποίες εξαρτάται το έργο σας και θα τις εγκαταστήσει και θα τις ενημερώσει για εσάς. Θα μάθουμε:
- πώς να εγκαταστήσετε το Composer
- να το χρησιμοποιείτε σε νέο ή υπάρχον έργο
Εγκατάσταση
Το Composer είναι ένα εκτελέσιμο αρχείο .phar
που μπορείτε να
κατεβάσετε και να εγκαταστήσετε ως εξής.
Windows
Χρησιμοποιήστε το επίσημο πρόγραμμα εγκατάστασης Composer-Setup.exe.
Linux, macOS
Το μόνο που χρειάζεστε είναι 4 εντολές, τις οποίες μπορείτε να αντιγράψετε από αυτή τη σελίδα.
Επιπλέον, αντιγράφοντας σε φάκελο που βρίσκεται στο PATH
του
συστήματος, το Composer γίνεται παγκοσμίως προσβάσιμο:
$ mv ./composer.phar ~/bin/composer # or /usr/local/bin/composer
Χρήση στο Project
Για να αρχίσετε να χρησιμοποιείτε το Composer στο έργο σας, το μόνο που
χρειάζεστε είναι ένα αρχείο composer.json
. Αυτό το αρχείο περιγράφει
τις εξαρτήσεις του έργου σας και μπορεί να περιέχει και άλλα
μεταδεδομένα. Το απλούστερο composer.json
μπορεί να μοιάζει
ως εξής:
{
"require": {
"nette/database": "^3.0"
}
}
Λέμε εδώ, ότι η εφαρμογή μας (ή η βιβλιοθήκη) εξαρτάται από το πακέτο
nette/database
(το όνομα του πακέτου αποτελείται από ένα όνομα
προμηθευτή και το όνομα του έργου) και θέλει την έκδοση που ταιριάζει
με τον περιορισμό έκδοσης ^3.0
.
Έτσι, όταν έχουμε το αρχείο composer.json
στη ρίζα του έργου και
εκτελούμε:
composer update
Το Composer θα κατεβάσει τη βάση δεδομένων Nette στον κατάλογο vendor
.
Δημιουργεί επίσης ένα αρχείο composer.lock
, το οποίο περιέχει
πληροφορίες σχετικά με το ποιες ακριβώς εκδόσεις βιβλιοθηκών
εγκατέστησε.
Το Composer δημιουργεί ένα αρχείο vendor/autoload.php
. Μπορείτε απλά να
συμπεριλάβετε αυτό το αρχείο και να αρχίσετε να χρησιμοποιείτε τις
κλάσεις που παρέχουν αυτές οι βιβλιοθήκες χωρίς καμία επιπλέον
εργασία:
require __DIR__ . '/vendor/autoload.php';
$db = new Nette\Database\Connection('sqlite::memory:');
Ενημέρωση πακέτων στις τελευταίες εκδόσεις
Για να ενημερώσετε όλα τα χρησιμοποιούμενα πακέτα στην τελευταία
έκδοση σύμφωνα με τους περιορισμούς έκδοσης που ορίζονται στο
composer.json
χρησιμοποιήστε την εντολή composer update
. Για
παράδειγμα, για την εξάρτηση "nette/database": "^3.0"
θα εγκαταστήσει την
τελευταία έκδοση 3.x.x, αλλά όχι την έκδοση 4.
Για να ενημερώσετε τους περιορισμούς έκδοσης στο αρχείο
composer.json
σε π.χ. "nette/database": "^4.1"
, για να μπορέσετε να
εγκαταστήσετε την τελευταία έκδοση, χρησιμοποιήστε την εντολή
composer require nette/database
.
Για να ενημερώσετε όλα τα χρησιμοποιούμενα πακέτα Nette, θα πρέπει να τα απαριθμήσετε όλα στη γραμμή εντολών, π.χ:
composer require nette/application nette/forms latte/latte tracy/tracy ...
Το οποίο είναι πρακτικά ανέφικτο. Επομένως, χρησιμοποιήστε ένα απλό σενάριο Composer Frontline που θα το κάνει για εσάς:
php composer-frontline.php
Δημιουργία νέου έργου
Το νέο έργο Nette μπορεί να δημιουργηθεί με την εκτέλεση μιας απλής εντολής:
composer create-project nette/web-project name-of-the-project
Αντί για το name-of-the-project
θα πρέπει να δώσετε το όνομα του
καταλόγου για το έργο σας και να εκτελέσετε την εντολή. Το Composer θα φέρει
το αποθετήριο nette/web-project
από το GitHub, το οποίο περιέχει ήδη το
αρχείο composer.json
, και αμέσως μετά θα εγκαταστήσει το ίδιο το Nette
Framework. Το μόνο που απομένει είναι να ελέγξετε τα δικαιώματα
εγγραφής στους καταλόγους temp/
και log/
και είστε έτοιμοι
να ξεκινήσετε.
Αν γνωρίζετε σε ποια έκδοση PHP θα φιλοξενηθεί το έργο, φροντίστε να το ρυθμίσετε.
Έκδοση PHP
Το Composer εγκαθιστά πάντα τις εκδόσεις των πακέτων που είναι συμβατές
με την έκδοση της PHP που χρησιμοποιείτε αυτή τη στιγμή (ή μάλλον, την
έκδοση της PHP που χρησιμοποιείται στη γραμμή εντολών όταν εκτελείτε το
Composer). Η οποία πιθανότατα δεν είναι η ίδια έκδοση που χρησιμοποιεί ο web
host σας. Γι' αυτό είναι πολύ σημαντικό να προσθέσετε πληροφορίες σχετικά
με την έκδοση της PHP στη φιλοξενία σας στο αρχείο composer.json
. Μετά
από αυτό, θα εγκατασταθούν μόνο οι εκδόσεις των πακέτων που είναι
συμβατές με τον host.
Για παράδειγμα, για να ρυθμίσετε το έργο να τρέχει σε PHP 8.2.3, χρησιμοποιήστε την εντολή:
composer config platform.php 8.2.3
Έτσι γράφεται η έκδοση στο αρχείο composer.json
:
{
"config": {
"platform": {
"php": "8.2.3"
}
}
}
Ωστόσο, ο αριθμός έκδοσης της PHP αναφέρεται και σε άλλο σημείο του
αρχείου, στην ενότητα require
. Ενώ ο πρώτος αριθμός καθορίζει την
έκδοση για την οποία θα εγκατασταθούν τα πακέτα, ο δεύτερος αριθμός
λέει για ποια έκδοση είναι γραμμένη η ίδια η εφαρμογή. (Φυσικά, δεν έχει
νόημα αυτές οι εκδόσεις να είναι διαφορετικές, οπότε η διπλή
καταχώρηση είναι πλεονασμός). Ορίζετε αυτή την έκδοση με την εντολή:
composer require php 8.2.3 --no-update
Ή απευθείας στο αρχείο composer.json
:
{
"require": {
"php": "8.2.3"
}
}
Αγνοώντας την έκδοση PHP
Τα πακέτα συνήθως καθορίζουν τόσο τη χαμηλότερη έκδοση της PHP με την
οποία είναι συμβατά όσο και την υψηλότερη έκδοση με την οποία έχουν
δοκιμαστεί. Αν σκοπεύετε να χρησιμοποιήσετε μια ακόμη νεότερη έκδοση
της PHP, ίσως για σκοπούς δοκιμής, το Composer θα αρνηθεί να εγκαταστήσει ένα
τέτοιο πακέτο. Η λύση είναι να χρησιμοποιήσετε την επιλογή
--ignore-platform-req=php+
, η οποία αναγκάζει το Composer να αγνοήσει τα ανώτερα
όρια της απαιτούμενης έκδοσης PHP.
Ψευδείς αναφορές
Όταν αναβαθμίζετε πακέτα ή αλλάζετε αριθμούς εκδόσεων, συμβαίνουν
συγκρούσεις. Ένα πακέτο έχει απαιτήσεις που συγκρούονται με ένα άλλο
και ούτω καθεξής. Ωστόσο, το Composer εκτυπώνει περιστασιακά ψευδή
μηνύματα. Αναφέρει μια σύγκρουση που στην πραγματικότητα δεν υπάρχει.
Σε αυτή την περίπτωση, βοηθάει να διαγράψετε το αρχείο composer.lock
και να δοκιμάσετε ξανά.
Αν το μήνυμα σφάλματος επιμένει, τότε εννοείται σοβαρά και πρέπει να διαβάσετε από αυτό τι πρέπει να τροποποιήσετε και πώς.
Packagist.org – Παγκόσμιο αποθετήριο
Το Packagist είναι το κύριο αποθετήριο πακέτων, στο οποίο το Composer προσπαθεί να αναζητήσει πακέτα, αν δεν του έχει ειπωθεί κάτι διαφορετικό. Μπορείτε επίσης να δημοσιεύσετε τα δικά σας πακέτα εδώ.
Τι γίνεται αν δεν θέλουμε το κεντρικό αποθετήριο
Αν έχουμε εσωτερικές εφαρμογές ή βιβλιοθήκες στην εταιρεία μας, οι οποίες δεν μπορούν να φιλοξενηθούν δημόσια στο Packagist, μπορούμε να δημιουργήσουμε τα δικά μας αποθετήρια για αυτά τα έργα.
Περισσότερα για τα αποθετήρια στην επίσημη τεκμηρίωση.
Αυτόματη φόρτωση
Ένα βασικό χαρακτηριστικό του Composer είναι ότι παρέχει αυτόματη
φόρτωση για όλες τις κλάσεις που εγκαθιστά, την οποία ξεκινάτε
συμπεριλαμβάνοντας ένα αρχείο vendor/autoload.php
.
Ωστόσο, είναι επίσης δυνατό να χρησιμοποιήσετε το Composer για να
φορτώσετε άλλες κλάσεις εκτός του φακέλου vendor
. Η πρώτη επιλογή
είναι να αφήσετε το Composer να σαρώσει τους καθορισμένους φακέλους και
υποφακέλους, να βρει όλες τις κλάσεις και να τις συμπεριλάβει στον
αυτόματο επαναφορτωτή. Για να το κάνετε αυτό, ορίστε το
autoload > classmap
στο composer.json
:
{
"autoload": {
"classmap": [
"src/", # includes the src/ folder and its subfolders
]
}
}
Στη συνέχεια, είναι απαραίτητο να εκτελείτε την εντολή
composer dumpautoload
με κάθε αλλαγή και να αφήνετε τους πίνακες
αυτόματης φόρτωσης να αναγεννώνται. Αυτό είναι εξαιρετικά άβολο και
είναι πολύ καλύτερο να αναθέσετε αυτή την εργασία στο RobotLoader, το οποίο εκτελεί την ίδια δραστηριότητα
αυτόματα στο παρασκήνιο και πολύ πιο γρήγορα.
Η δεύτερη επιλογή είναι να ακολουθήσετε το PSR-4. Με απλά λόγια, πρόκειται για ένα σύστημα
όπου τα namespaces και τα ονόματα των κλάσεων αντιστοιχούν στη δομή των
καταλόγων και των ονομάτων των αρχείων, δηλαδή το App\Core\RouterFactory
βρίσκεται στο αρχείο /path/to/App/Core/RouterFactory.php
. Παράδειγμα
διαμόρφωσης:
{
"autoload": {
"psr-4": {
"App\\": "app/" # the App\ namespace is in the app/ directory
}
}
}
Ανατρέξτε στην Τεκμηρίωση του Composer για τον ακριβή τρόπο διαμόρφωσης αυτής της συμπεριφοράς.
Δοκιμές νέων εκδόσεων
Θέλετε να δοκιμάσετε μια νέα έκδοση ανάπτυξης ενός πακέτου. Πώς να το
κάνετε; Αρχικά, προσθέστε αυτό το ζευγάρι επιλογών στο αρχείο
composer.json
, το οποίο θα σας επιτρέψει να εγκαταστήσετε εκδόσεις
ανάπτυξης πακέτων, αλλά θα το κάνει μόνο αν δεν υπάρχει συνδυασμός
σταθερών εκδόσεων που να ικανοποιεί τις απαιτήσεις:
{
"minimum-stability": "dev",
"prefer-stable": true,
}
Συνιστούμε επίσης να διαγράψετε το αρχείο composer.lock
, επειδή
μερικές φορές το Composer αρνείται ακατανόητα να εγκαταστήσει και αυτό θα
λύσει το πρόβλημα.
Ας υποθέσουμε ότι το πακέτο είναι nette/utils
και η νέα έκδοση είναι
4.0. Το εγκαθιστάτε με την εντολή:
composer require nette/utils:4.0.x-dev
Ή μπορείτε να εγκαταστήσετε μια συγκεκριμένη έκδοση, για παράδειγμα 4.0.0-RC2:
composer require nette/utils:4.0.0-RC2
Εάν ένα άλλο πακέτο εξαρτάται από τη βιβλιοθήκη και είναι κλειδωμένο
σε μια παλαιότερη έκδοση (π.χ. ^3.1
), είναι ιδανικό να ενημερώσετε
το πακέτο ώστε να λειτουργεί με τη νέα έκδοση. Ωστόσο, αν θέλετε απλώς
να παρακάμψετε τον περιορισμό και να αναγκάσετε το Composer να
εγκαταστήσει την έκδοση ανάπτυξης και να προσποιηθεί ότι είναι μια
παλαιότερη έκδοση (π.χ. 3.1.6), μπορείτε να χρησιμοποιήσετε τη λέξη-κλειδί
as
:
composer require nette/utils "4.0.x-dev as 3.1.6"
Κλήση εντολών
Μπορείτε να καλέσετε τις δικές σας προσαρμοσμένες εντολές και
σενάρια μέσω του Composer σαν να ήταν εγγενείς εντολές του Composer. Τα σενάρια
που βρίσκονται στο φάκελο vendor/bin
δεν χρειάζεται να
προσδιορίσουν αυτόν το φάκελο.
Ως παράδειγμα, ορίζουμε μια δέσμη ενεργειών στο αρχείο composer.json
που χρησιμοποιεί το Nette Tester για την εκτέλεση
δοκιμών:
{
"scripts": {
"tester": "tester tests -s"
}
}
Στη συνέχεια, εκτελούμε τις δοκιμές με το composer tester
. Μπορούμε να
καλέσουμε την εντολή ακόμη και αν δεν βρισκόμαστε στον ριζικό φάκελο
του έργου, αλλά σε έναν υποκατάλογο.
Αποστολή ευχαριστιών
Θα σας δείξουμε ένα κόλπο που θα κάνει τους συγγραφείς ανοιχτού
κώδικα ευτυχισμένους. Μπορείτε εύκολα να δώσετε ένα αστέρι στο GitHub
στις βιβλιοθήκες που χρησιμοποιεί το έργο σας. Απλά εγκαταστήστε τη
βιβλιοθήκη symfony/thanks
:
composer global require symfony/thanks
Και στη συνέχεια εκτελέστε:
composer thanks
Δοκιμάστε το!
Διαμόρφωση
Το Composer είναι στενά ενσωματωμένο με το εργαλείο ελέγχου εκδόσεων Git. Εάν δεν χρησιμοποιείτε το Git, είναι απαραίτητο να το δηλώσετε στο Composer:
composer -g config preferred-install dist