Ceci est mon environnement. Veuillez noter que ceci est également défini dans les modes de développement et les modes de production appropriés.
Dev:
https://ar.dev.loc/
https://en.dev.loc/
Live:
https://ar.site.com/
https://en.site.com/
J'utilise une configuration multi-magasins avec l'arabe et l'anglais et tout fonctionne bien, y compris les modules de construction et la construction de modèles.
Cependant, si je modifie un fichier less ou JS (malgré l'utilisation de grunt less ou grunt watch), je dois exécuter toutes les commandes suivantes sur mon environnement de développement pour pouvoir les voir une seule fois sur ma machine locale.
$ rm -rf var/cache var/page_cache var/view_preprocessed pub/static
$ mkdir pub/static
$ bin/magento setup:static-content:deploy
$ bin/magento setup:static-content:deploy ar_SA
$ grunt exec less // sometimes I leave this do this
$ grunt // I swap between these
Cela prend beaucoup de temps pour faire ce processus à chaque fois. C'est frustrant, car je suis un codeur rapide et j'aime voir CSS et Less immédiatement sur le site et ne pas attendre.
L’approche rapide que notre équipe est en train d’apporter est de modifier pub/static
, puis nous les envoyons à less et app/design
, etc., puis nous procédons comme indiqué ci-dessus, puis à git.
Live Server est à peu près la même chose. Git pull puis mode maintenance (folie sur un site ecom en direct! Qui construit M2? Ensuite, nous lançons des commandes ci-dessus - temps d'arrêt de 45 minutes)
Il doit sûrement exister un moyen plus rapide pour notre déploiement, notre développement et notre équipe de mieux fonctionner et de voir les changements plus rapidement sans temps d'arrêt!
Même la documentation officielle de Magento 2 indique que votre site LIVE doit passer en mode maintenance et temps d’interruption pour publier du contenu - ce n’est pas une option pour nous. Les CTO ne sont pas contents. Absurde.
Questions connexes avec des personnes qui s’interrogent sur un développement plus rapide, mêmes problèmes:
Les modifications de CSS ne se reflètent qu'après la commande deploy dans magento2
Je veux donc rassembler tous les problèmes et résoudre ce problème.
oui, cela peut être plus rapide en suivant les étapes suivantes:
vous pouvez trouver le fichier dans pub static en suivant la commande
find pub/static -iname yourjsfile.js
.htaccess dans pub/static envoie les fichiers manquants à pub/static.php avec le paramètre resource et pub/static.php file crée un StaticResource pour le fichier, s'il est disponible et déployer cela.
Remarque: cela ne fonctionne qu'avec Apache mod_rewrite
Pour Nginx, vous devez configurer la même chose via nginx.conf.sample
Puisque j'utilise l'option -j
(--jobs)
pour créer un nouveau processus, je réduis le temps static-content:deploy
de plus de 10 minutes à moins d'une minute. Voir Magento/Deploy/Process/Queue.php
php bin/magento setup:static-content:deploy -j[JOBS_AMOUNT]
L'option
--jobs
permet d'activer le traitement en parallèle en utilisant le nombre spécifié de travaux. La valeur par défaut est 4. Pour que la tâche soit exécutée dans un processus (par exemple, si votre système ne prend pas en charge le processus de fourrage), utilisez--jobs 1
. // voir: devdocs.magento.com
Cette option ne peut être utilisée que si pcntl
est activé.
Aucune bibliothèque externe n'est nécessaire pour construire cette extension.
La prise en charge du contrôle de processus dans PHP est pas activé par défaut.
Vous devez compiler la version CGI ou CLI de PHP avec l'option de configuration --enable-pcntl
lors de la compilation de PHP pour activer la prise en charge du contrôle de processus.
Remarque: Actuellement, ce module ne fonctionnera pas sur des plateformes autres qu'Unix (Windows).
Remarque: que
pcntl_fork
sera pas fonctionnera si PHP est exécuté en tant que module Apache, auquel cas cette fonction n'existera pas!
Commentaire général:
Vous ne devez pas faire de "grognement" ici comme vous configurez: static-content: deploy. Vous pouvez générer le contenu statique pour en_US (c’est-à-dire sans le paramètre) et ar_SA en parallèle (bash vous permet de le faire assez facilement).
Si vous manquez des ressources HTTPS (sécurisées) (c'est peut-être la raison pour laquelle vous avez également utilisé grunt?), Assurez-vous que la variable d'environnement "HTTPS" est définie (par exemple HTTPS=ON
) pour le processus de compilation du contenu statique ( ref ).
En dehors de cela, oui, cela prend du temps. Ce qui a attiré l’attention, c’est que la compilation de PHP moins prend un certain temps. Une autre idée qui m'est venue à l'esprit lorsqu'un autre développeur en a parlé est de mettre moins de compilation en cache dans un cache moins local et de ne le recompiler que si un fichier est réellement modifié. Peut-être que vous pouvez essayer aussi.
Je ne suis pas encore responsable du piratage d'un PoC, mais je pense que cela devrait être un bon test pour l'affirmation selon laquelle le moins de compilation est le goulot d'étranglement.
Je peux aussi fortement suggérer d’exécuter un serveur de compilation compilé sur git Push automatiquement pour alléger le fardeau.
Je ne suis pas familier avec la magnéto mais cela peut fonctionner pour vous. Lorsque je mets à jour mes sites, je suis les étapes suivantes:
Supposons que le site se trouve dans le répertoire site
.
$ cp -r site site-update
# update the site in site-update directory
$ mv site site-old && mv site-update site
De cette façon, mes sites sont mis à jour sans aucun temps d'arrêt.
Je n'ai pas touché setup:static-content:deploy
depuis un moment. Après en avoir marre du lent processus de déploiement dans Magento 2, j'ai conçu le mien qui me permet de modifier un fichier CSS ou JS et de le refléter presque immédiatement sur le site. Voici la magie:
cd /path/to/docroot/app/design/frontend/$VENDOR/$THEME
find * -type f \( -name "*.css" -o -name "*.js" \) -cmin -10 | xargs -I {} bash -c 'dest=/path/to/docroot/pub/static/frontend/$VENDOR/$THEME/*/$(echo {} | sed -E "s/(web\/|\/[^/]+$)//g"); echo Deploying {} to $dest ...; mkdir -p $dest && cp {} $_'
cd - 1> /dev/null
Faisons le décomposer ...
cd /path/to/docroot/app/design/frontend/$VENDOR/$THEME
- accédez au répertoire du thème actif (remplacez $VENDOR
et $THEME
par vos propres valeurs)find * -type f \( -name "*.css" -o -name "*.js" \) -cmin -10
- trouve tous les fichiers CSS et JS qui ont été modifiés de quelque manière que ce soit au cours des 10 dernières minutes dans le répertoire du thème (*
supprime le ./
en tête dans les résultats); n'hésitez pas à modifier les paramètres pour répondre à vos besoinsxargs -I {} bash -c
- pour chaque fichier modifié, exécutez les commandes de # 4-6 (le chemin relatif du fichier modifié est stocké dans {}
)dest=/path/to/docroot/pub/static/frontend/$VENDOR/$THEME/*/$(echo {} | sed -E "s/(web\/|\/[^/]+$)//g")
- définit le chemin de destination du déploiement *
glob se charge de faire correspondre les paramètres régionaux dans lesquels vous vous trouvez.$(...)
génère un sous-shell pour extraire uniquement la partie du chemin source que nous devons ajouter au chemin de destination (le niveau de répertoire web
n'existe pas sous la variable pub
)echo Deploying {} to $dest ...
- enregistre l'activité dans la console pour que vous sachiez quels fichiers sont en cours de déploiementmkdir -p $dest && cp {} $_
- crée la structure du répertoire de destination; si et seulement si la structure de répertoire a été créée avec succès, copiez le fichier modifié dans sa destination de déploiement sous pub
($_
pointe sur le dernier argument de la commande précédente, mkdir
, qui est $dest
).cd - 1> /dev/null
- permet de revenir au répertoire précédent afin de pouvoir continuer là où vous l'avez laisséVous pouvez jeter tout cela dans un alias pour le réduire à une seule commande, mais n'oubliez pas d'échapper aux guillemets simples:
alias update='cd /path/to/docroot/app/design/frontend/$VENDOR/$THEME; find * -type f \( -name "*.css" -o -name "*.js" \) -cmin -10 | xargs -I {} bash -c '"'"'dest=/path/to/docroot/pub/static/frontend/$VENDOR/$THEME/*/$(echo {} | sed -E "s/(web\/|\/[^/]+$)//g"); echo Deploying {} to $dest ...; mkdir -p $dest && cp {} $_'"'"'; cd - 1> /dev/null'
Si vous utilisez varnish, vous devez ajouter une commande pour redémarrer varnish à la fin de l'alias (par exemple, Sudo service varnish restart
), sinon vous risquez toujours de toucher des actifs statiques mis en cache.
Si vous êtes trop paresseux pour taper update
chaque fois que vous effectuez un changement, vous pouvez le mettre dans un cron ou l'intégrer dans une tâche de moniteur de grunt ou l'équivalent.
Dans notre société, nous gérons les déploiements de Magento2 à l’aide de Capistrano . Il existe également un ensemble de tâches spécifiques à pour Magento 2 qui fonctionne très bien.
Avec capistrano, vous configurez la racine de votre serveur Web pour qu'elle pointe vers un lien symbolique pointant vers un dossier "release". Lorsque vous démarrez un déploiement, toute la compilation (di, contenus statiques, ecc) est effectuée dans un dossier séparé afin que votre site Web en ligne ne soit pas affecté et reste en ligne. À la fin de la procédure, et uniquement s'il n'y a pas d'erreur, le lien symbolique est basculé vers la nouvelle version.
De cette façon, les temps d'arrêt sont généralement nuls ou réduits à quelques secondes.
Capistrano fournit également une fonctionnalité de base de «restauration» qui permet de revenir rapidement à une ancienne version en cas de problème.
J'ai également remarqué que si vous avez des connexions css et js, il semble que vous soyez complètement bouleversé si vous exécutez la mise à niveau de l'installation, la version est alors cassée et le css/js est réveillé jusqu'à ce que vous reconstruisiez le contenu statique.
Je ne sais pas comment ils pensent que cela devrait fonctionner pour les personnes en production. À peu près tout peut sortir de la guerre et il faut reconstruire.
J'ai eu un peu de chance avec 1. activez la connexion css/js 2. alors vous pouvez exécuter le déploiement de contenu statique, semble garder le ur joli intack 3. vider le cache (puis ajoute la nouvelle version12312312 aux URL statiques)
Mais sérieusement, pas moyen de rester solide avec les déploiements.
TheBlackBenzKid très curieux où vous vous êtes retrouvé un an plus tard, avez-vous abandonné magento?
Je suis venu avec une solution à ce problème.
Vous devez publier le contenu du magasin de votre choix en
php bin/magento setup:static-content:deploy [lang(en_US)] -t [vendor]/[theme]
Je ne changerai pas parce que le cache magento, il suffit donc de le supprimer manuellement
rm -rf pub/static/_*/*
php bin/magento cache:flush; php bin/magento cache:clean;
L'actualisation de votre page et fait maintenant, il faut de nouvelles modifications quand il régénère de page.
Ces étapes sont obligatoires pour les modifications de contenu phtml et statique, les modifications de mise en page nécessitent le vidage du cache et les modifications sur les contrôleurs sont une corvée difficile, car vous devez utiliser di: compiler celui-ci vous oblige à quitter la production.