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
Χρήση στο έργο
Για να αρχίσουμε να χρησιμοποιούμε τον Composer στο έργο μας,
χρειαζόμαστε μόνο το αρχείο composer.json
. Αυτό περιγράφει τις
εξαρτήσεις του έργου μας και μπορεί επίσης να περιέχει άλλα
μεταδεδομένα. Ένα βασικό composer.json
μπορεί λοιπόν να μοιάζει
ως εξής:
{
"require": {
"nette/database": "^3.0"
}
}
Λέμε εδώ ότι η εφαρμογή μας (ή η βιβλιοθήκη) απαιτεί το πακέτο
nette/database
(το όνομα του πακέτου αποτελείται από το όνομα του
οργανισμού και το όνομα του έργου) και θέλει μια έκδοση που αντιστοιχεί
στη συνθήκη ^3.0
(δηλαδή την τελευταία έκδοση 3).
Έχουμε λοιπόν στη ρίζα του έργου το αρχείο composer.json
και
εκκινούμε την εγκατάσταση:
composer update
Ο Composer θα κατεβάσει το Nette Database στον φάκελο 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 project-name
Ως project-name
εισάγετε το όνομα του καταλόγου για το έργο σας και
επιβεβαιώστε. Ο Composer θα κατεβάσει το αποθετήριο nette/web-project
από το
GitHub, το οποίο περιέχει ήδη το αρχείο composer.json
, και αμέσως μετά το
Nette Framework. Θα πρέπει ήδη να αρκεί μόνο να ορίσετε τα δικαιώματα
εγγραφής στους φακέλους temp/
και log/
και το έργο θα πρέπει
να ζωντανέψει.
Αν γνωρίζετε σε ποια έκδοση PHP θα φιλοξενηθεί το έργο, μην ξεχάσετε να την ορίσετε.
Έκδοση PHP
Ο Composer εγκαθιστά πάντα τις εκδόσεις των πακέτων που είναι συμβατές με
την έκδοση PHP που χρησιμοποιείτε αυτή τη στιγμή (καλύτερα, με την έκδοση
PHP που χρησιμοποιείται στη γραμμή εντολών κατά την εκτέλεση του Composer).
Αυτό όμως πιθανότατα δεν είναι η ίδια έκδοση που χρησιμοποιεί το hosting
σας. Γι' αυτό είναι πολύ σημαντικό να προσθέσετε στο αρχείο
composer.json
την πληροφορία για την έκδοση PHP στο hosting. Στη συνέχεια,
θα εγκαθίστανται μόνο οι εκδόσεις των πακέτων που είναι συμβατές με το
hosting.
Το ότι το έργο θα εκτελείται, για παράδειγμα, σε PHP 8.2.3, το ορίζουμε με την εντολή:
composer config platform.php 8.2.3
Έτσι, η έκδοση θα καταγραφεί στο αρχείο composer.json
:
{
"config": {
"platform": {
"php": "8.2.3"
}
}
}
Ωστόσο, ο αριθμός έκδοσης της PHP αναφέρεται και σε άλλο σημείο του
αρχείου, στην ενότητα require
. Ενώ ο πρώτος αριθμός καθορίζει για
ποια έκδοση θα εγκατασταθούν τα πακέτα, ο δεύτερος αριθμός λέει για
ποια έκδοση είναι γραμμένη η ίδια η εφαρμογή. Και σύμφωνα με αυτόν, για
παράδειγμα, το PhpStorm ορίζει το PHP language level. (Φυσικά, δεν έχει νόημα
αυτές οι εκδόσεις να διαφέρουν, οπότε η διπλή καταγραφή είναι αβλεψία.)
Αυτή την έκδοση την ορίζετε με την εντολή:
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 προσπαθεί να αναζητήσει πακέτα, αν δεν του πούμε διαφορετικά. Μπορούμε επίσης να δημοσιεύσουμε εδώ τα δικά μας πακέτα.
Τι γίνεται αν δεν θέλουμε να χρησιμοποιήσουμε το κεντρικό αποθετήριο;
Αν έχουμε εσωτερικές εταιρικές εφαρμογές, τις οποίες απλά δεν μπορούμε να φιλοξενήσουμε δημόσια, τότε δημιουργούμε γι' αυτές ένα εταιρικό αποθετήριο.
Περισσότερα για το θέμα των αποθετηρίων στην επίσημη τεκμηρίωση.
Autoloading
Ένα θεμελιώδες χαρακτηριστικό του Composer είναι ότι παρέχει αυτόματη
φόρτωση για όλες τις κλάσεις που έχει εγκαταστήσει, την οποία ξεκινάτε
συμπεριλαμβάνοντας το αρχείο vendor/autoload.php
.
Ωστόσο, είναι δυνατό να χρησιμοποιήσετε τον Composer και για τη φόρτωση
άλλων κλάσεων εκτός του φακέλου vendor
. Η πρώτη επιλογή είναι να
αφήσετε τον Composer να σαρώσει καθορισμένους φακέλους και υποφακέλους, να
βρει όλες τις κλάσεις και να τις συμπεριλάβει στον autoloader. Αυτό
επιτυγχάνεται ορίζοντας το autoload > classmap
στο composer.json
:
{
"autoload": {
"classmap": [
"src/", # περιλαμβάνει τον φάκελο src/ και τους υποφακέλους του
]
}
}
Στη συνέχεια, είναι απαραίτητο σε κάθε αλλαγή να εκτελείτε την εντολή
composer dumpautoload
και να αφήνετε τους πίνακες αυτόματης φόρτωσης να
αναδημιουργηθούν. Αυτό είναι εξαιρετικά άβολο και είναι πολύ καλύτερο
να αναθέσετε αυτή την εργασία στο RobotLoader,
το οποίο εκτελεί την ίδια δραστηριότητα αυτόματα στο παρασκήνιο και
πολύ πιο γρήγορα.
Η δεύτερη επιλογή είναι η τήρηση του PSR-4. Με
απλά λόγια, πρόκειται για ένα σύστημα όπου οι χώροι ονομάτων και τα
ονόματα κλάσεων αντιστοιχούν στη δομή καταλόγων και τα ονόματα
αρχείων, δηλαδή π.χ. το App\Core\RouterFactory
θα βρίσκεται στο αρχείο
/path/to/App/Core/RouterFactory.php
. Παράδειγμα διαμόρφωσης:
{
"autoload": {
"psr-4": {
"App\\": "app/" # ο χώρος ονομάτων App\ βρίσκεται στον κατάλογο app/
}
}
}
Πώς ακριβώς να διαμορφώσετε τη συμπεριφορά θα μάθετε στην τεκμηρίωση του 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
. Μπορούμε να καλέσουμε την εντολή ακόμα κι αν δεν
βρισκόμαστε στον ριζικό φάκελο του έργου, αλλά σε κάποιον υποφάκελο.
Στείλτε ευχαριστίες
Θα σας δείξουμε ένα κόλπο με το οποίο θα ευχαριστήσετε τους
δημιουργούς open source. Με έναν απλό τρόπο, δίνετε αστέρι στο GitHub στις
βιβλιοθήκες που χρησιμοποιεί το έργο σας. Αρκεί να εγκαταστήσετε τη
βιβλιοθήκη symfony/thanks
:
composer global require symfony/thanks
Και στη συνέχεια να εκτελέσετε:
composer thanks
Δοκιμάστε το!
Διαμόρφωση
Ο Composer είναι στενά συνδεδεμένος με το εργαλείο διαχείρισης εκδόσεων Git. Αν δεν το έχετε εγκατεστημένο, πρέπει να πείτε στον Composer να μην το χρησιμοποιεί:
composer -g config preferred-install dist