Composer a la possibilité de charger plusieurs dépendances uniquement pendant le développement, de sorte que les outils ne seront pas installés en production (sur le serveur live). C'est (en théorie) très pratique pour les scripts qui n'ont de sens qu'en développement, comme les tests, les faux outils de données, le débogueur, etc.
La solution consiste à ajouter un require-dev
bloc supplémentaire avec les outils dont vous avez besoin en dev:
"require-dev": {
"codeception/codeception": "1.6.0.3"
}
puis (théoriquement) charger ces dépendances via
composer install --dev
Problème et question:
Composer a radicalement changé le comportement de install
et update
en 2013, les require-dev
dépendances sont désormais installées par défaut (!), N'hésitez pas à créer un composer.json avec un require-dev
bloc et à effectuer une composer install
reproduction.
Car le moyen le plus accepté de déployer est de pousser le compositeur. lock (qui contient votre configuration actuelle du compositeur), puis effectuez uncomposer install
sur le serveur de production, cela installera également les éléments de développement.
Quelle est la bonne façon de déployer ceci sans installer les dépendances -dev?
Remarque: j'essaie de créer un Q / R canonique ici pour clarifier le déploiement étrange de Composer. N'hésitez pas à modifier cette question.
composer.lock
ne doit jamais être ajouté au repo Git, JAMAIS. La bonne approche consiste à utiliser la mise à jour du compositeur sur la mise en scène, puis à synchroniser le fichier en production (si tout fonctionne, bien sûr). La préparation doit être la copie exacte d'un environnement de production.composer.lock
devrait faire partie de.gitignore
.Réponses:
Pourquoi
Il y a à mon humble avis une bonne raison pour laquelle Composer utilisera le
--dev
drapeau par défaut (lors de l'installation et mise à jour) de nos jours. Composer est principalement exécuté dans les scénarios où c'est le comportement souhaité:Le flux de travail de base de Composer est le suivant:
composer.phar install --dev
fichiers json et lock sont validés dans VCS.composer.phar install --dev
.composer.phar require <package>
ajoutez--dev
si vous voulez le package dans larequire-dev
section (et validez).composer.phar install --dev
.composer.phar update --dev <package>
(et commit).composer.phar install --dev
.composer.phar install --no-dev
Comme vous pouvez le voir, le
--dev
drapeau est (beaucoup) plus utilisé que le--no-dev
drapeau, surtout lorsque le nombre de développeurs travaillant sur le projet augmente.Déploiement de production
Eh bien, le fichier
composer.json
etcomposer.lock
doit être validé dans VCS. Ne l'omettez pascomposer.lock
car il contient des informations importantes sur les versions de package à utiliser.Lors de l'exécution d'un déploiement de production, vous pouvez transmettre l'
--no-dev
indicateur à Composer:Le
composer.lock
fichier peut contenir des informations sur les packages de développement. Cela n'a pas d'importance. L'--no-dev
indicateur s'assurera que ces paquets de développement ne sont pas installés.Quand je dis «déploiement de production», je veux dire un déploiement qui vise à être utilisé en production. Je ne dis pas si un
composer.phar install
devrait être fait sur un serveur de production, ou sur un serveur intermédiaire où les choses peuvent être examinées. Ce n'est pas la portée de cette réponse. Je montre simplement comment fairecomposer.phar install
sans installer les dépendances "dev".Hors sujet
Le
--optimize-autoloader
drapeau peut également être souhaitable en production (il génère un class-map qui accélérera le chargement automatique dans votre application):Ou lorsque le déploiement automatisé est effectué:
Si votre base de code le prend en charge, vous pouvez le remplacer
--optimize-autoloader
par--classmap-authoritative
. Plus d'infos icila source
--optimize-autoloader
. Considérez aussi--classmap-authoritative
- De la documentation ici getcomposer.org/doc/03-cli.md, vous pouvez voir ceci: "Chargement automatique des classes à partir du classmap uniquement. Active implicitement --optimize-autoloader" afin que vous puissiez utiliser si vous connaissez les classes "sont there ", ce qui devrait probablement se produire dans votre environnement prod, sauf si vous générez des classes dynamiquement.optimize-autoloader
directement dans lecomposer.json
:{"config": { "optimize-autoloader": true } }
En fait, je recommanderais fortement CONTRE d'installer les dépendances sur le serveur de production.
Ma recommandation est de récupérer le code sur une machine de déploiement, d'installer les dépendances si nécessaire (cela inclut de NE PAS installer de dépendances de développement si le code passe en production), puis de déplacer tous les fichiers vers la machine cible.
Pourquoi?
composer install
En bref: utilisez Composer dans un environnement que vous pouvez contrôler. Votre machine de développement est éligible car vous disposez déjà de tout ce dont vous avez besoin pour faire fonctionner Composer.
La commande à utiliser est
Cela fonctionnera dans n'importe quel environnement, que ce soit le serveur de production lui-même, une machine de déploiement ou la machine de développement qui est censée effectuer une dernière vérification pour déterminer si une exigence de développement est incorrectement utilisée pour le logiciel réel.
La commande n'installe ni ne désinstalle activement les exigences de développement déclarées dans le fichier composer.lock.
Si cela ne vous dérange pas de déployer des composants logiciels de développement sur un serveur de production, l'exécution
composer install
ferait le même travail, mais augmenterait simplement la quantité d'octets déplacés et créerait également une déclaration de chargeur automatique plus grande.la source
app-1.34.phar
etc.). Il existe un mécanisme distinct qui est notifié et décide quand récupérer ce fichier, où le transférer, puis quoi en faire. Certaines équipes choisissent de décompresser le phar une fois qu'il est sur le serveur et certaines équipes l'exécutent tel quel. Cela a donné beaucoup de confiance à la stabilité et à la reproductibilité de nos déploiements.Maintenant
require-dev
est activé par défaut, pour le développement local, vous pouvez fairecomposer install
etcomposer update
sans le--dev
option.Lorsque vous souhaitez effectuer un déploiement en production, vous devez vous assurer
composer.lock
qu'aucun package ne provient derequire-dev
.Vous pouvez le faire avec
Une fois que vous avez testé localement avec,
--no-dev
vous pouvez tout déployer en production et installer en fonction ducomposer.lock
. Vous avez à nouveau besoin de l'--no-dev
option ici, sinon le compositeur dira "Le fichier de verrouillage ne contient pas d'informations require-dev" .Remarque: soyez prudent avec tout ce qui a le potentiel d'introduire des différences entre le développement et la production! J'essaie généralement d'éviter require-dev dans la mesure du possible, car inclure des outils de développement n'est pas une grosse surcharge.
la source
composer.lock
dépendances de développement. Vous exécuteriez simplementcomposer install --no-dev
, et vous n'obtiendrez que les dépendances régulières installées - en fait, Composer supprimera également toutes les dépendances de développement à cette étape.composer.lock
contenait des dépendances de développement (et affectait potentiellement les versions de packages non-dev), je voudrais le mettre à jour pour refléter comment il serait en production. Cela vous oblige également à exécutercomposer install --no-dev
en production, tout commecomposer install
l'erreur. Techniquement, je pense que vous avez raison; ce n'est pas obligatoire, mais c'est un niveau de sécurité supplémentaire, ce que j'aime.dev/tool
etprod/lib:~1.0
. Le plus récent prod / lib est 1.3, mais dev / tool nécessite égalementprod/lib:1.1.*
. Résultat: vous allez installer la version 1.1.9 (la plus récente de la branche 1.1.x) et l'utiliser pendant votre développement. Je dirais qu'il n'est PAS sûr de simplement mettre à jour--no-dev
, incluez donc le plus récent prod / lib 1.3 et supposez que tout fonctionne sans test. Et peut-être que les tests sont alors impossibles à cause du manque de développement / outil. Je suppose que parce que dev / tool n'est pas nécessaire en production, il ne devrait pas être déployé, mais le logiciel doit alors utiliser prod / lib 1.1.9.--no-dev
vous devez le tester localement, comme je l'ai mentionné dans la réponse. Je recommanderais quand même de ne pas utiliser--no-dev
du tout.composer update
puis faites du développement, puis faitescomposer update --no-dev
, puis faites les tests de version, puis passez à la production et faitescomposer install --no-dev
. Deux problèmes: 1. Je ne peux pas tester la version sans dépendances de développement, et 2. Je ne peux pas installer avec par exemple Git en production.Sur les serveurs de production je renomme
vendor
àvendor-<datetime>
et pendant le déploiement aura deux dirs fournisseurs.Un cookie HTTP oblige mon système à choisir le nouveau fournisseur
autoload.php
, et après les tests, je fais un basculement entièrement atomique / instantané entre eux pour désactiver l'ancien répertoire du fournisseur pour toutes les demandes futures, puis je supprime le répertoire précédent quelques jours plus tard.Cela évite tout problème causé par les caches du système de fichiers que j'utilise dans apache / php, et permet également à tout code PHP actif de continuer à utiliser le répertoire précédent du fournisseur.
Malgré d'autres réponses qui le déconseillent, je cours personnellement
composer install
sur le serveur, car c'est plus rapide que rsync depuis ma zone de préparation (une VM sur mon ordinateur portable).J'utilise
--no-dev --no-scripts --optimize-autoloader
. Vous devriez lire les documents pour chacun d'eux pour vérifier si cela est approprié à votre environnement.la source
Je pense qu'il vaut mieux automatiser le processus:
Ajoutez le fichier composer.lock dans votre référentiel git, assurez-vous d'utiliser composer.phar install --no-dev lorsque vous relâchez, mais dans votre machine de développement, vous pouvez utiliser n'importe quelle commande composer sans souci, cela n'ira pas en production, le production basera ses dépendances dans le fichier de verrouillage.
Sur le serveur, vous extrayez cette version ou cette étiquette spécifique et exécutez tous les tests avant de remplacer l'application, si les tests réussissent, vous poursuivez le déploiement.
Si le test dépend de dépendances de développement, comme composer n'a pas de dépendance de portée de test, une solution pas très élégante pourrait être d'exécuter le test avec les dépendances de développement ( installer composer.phar ), supprimer la bibliothèque du fournisseur, exécuter installer composer.phar - -no-dev encore une fois, cela utilisera les dépendances mises en cache, donc c'est plus rapide. Mais c'est un hack si vous connaissez le concept de portées dans d'autres outils de construction
Automatisez ça et oubliez le reste, allez boire une bière :-)
PS: Comme dans le commentaire @Sven ci-dessous, ce n'est pas une bonne idée de ne pas extraire le fichier composer.lock, car cela fera fonctionner l'installation du compositeur en tant que mise à jour du compositeur.
Vous pouvez faire cette automatisation avec http://deployer.org/ c'est un outil simple.
la source
composer.lock
feracomposer install
agir commecomposer update
. Les versions que vous déployez ne sont donc pas celles avec lesquelles vous avez développé. Ceci est susceptible de générer des problèmes (et plus encore à la lumière du seul problème de sécurité résolu récemment avec «remplacer» dans Composer). Vous ne devriez JAMAIS courircomposer update
sans surveillance sans vérifier qu'il n'a rien cassé.