J’ai un projet dans lequel j’utilise plusieurs thèmes qui héritent entre-eux. J’exécute la commande grunt exec
pour compiler les assets front, mais l’erreur In SourceThemeDeployCommand.php line 179 apparaît également lorsque j’utilise la commande Magento setup:static-content:deploy
:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Processed Area: frontend, Locale: en_US, Theme: Sm/venuse, File type: less. >> >> In SourceThemeDeployCommand.php line 179: >> >> Verify entered values of the argument and options. Unable to get content fo >> r 'frontend/Sm/venuse/en_US/css/source/jquery.fancybox/_jquery.fancybox.les >> s' >> dev:source-theme:deploy [--type TYPE] [--locale LOCALE] [--area AREA] [--theme THEME] [--] [<file>...] >> Exited with code: 1. >> Error executing child process: Error: Process exited with code 1. Warning: Task "exec:venuse" failed. Use --force to continue. Aborted due to warnings. |
Fil de discussion m’ayant aidé pour la résolution: Error when run command grunt:exec in Magento 2.2.0 #12271.
Les éléments à vérifier:
- Les libellés/noms de vos thèmes ne contiennent ni chiffres, ni caractères en majuscules
- Vos thèmes ont tous le
type
égal à0
dans la tabletheme
en base de données - Regarder également dans les fichiers
app/etc/config.php
etapp/etc/env.php
si letype
n’est pas seté à1
pour vos thèmes et corriger le cas échéant. - Vérifier votre version de node et l’upgrader/downgrader au besoin
- Utiliser
@magento_import
à la place de@import
dans vos sources LESS pour importer les fichiers que Grunt ne trouve pas - Si certaines configuration en admin genèrent des CSS pour le front (typiquement les focntionnalités d’habillage du front en BO proposées par certains thèmes (Venuse, Supro…)), n’oubliez pas de vous rendre en BO et de cliquer sur le bouton « Save Config » (même sans rien changer) afin que les champs d’habillage soient pris en compte
- …en dernier lieu, suppression du dossier vendor, ré-installation fraîche via la commande
composer install
et exécution de la commande Magentosetup:upgrade
(mais j’y crois moyennement pour résoudre notre problème…)
Vos thèmes ont tous le type
égal à 0
dans la table theme
en base de données
Source. Un theme avec un type de
1 a été automatiquement paramétré comme « virtuel » par Magento 2!
This error happens for multiple reasons, but probably the most annoying and most frequent relates to the fact that Magento2 attempts to validate themes.
Explanation
If a theme exists in the database, but is not physically available in the filesystem at the time the
magento setup:install
command is run, Magento2 will set it as a « virtual » theme. Once a theme is set as virtual, it is never unset by Magento2. It will forever be virtual until it is manually reset in the database. To reset the theme, go to thetheme
table, and set thetype
field to0
, and re-associate the theme with anyparent_id
. A theme with atype
of1
has been set to virtual.This problem will provide a stack trace like the following:
12345 Fatal error: Uncaught Error: Call to a member function getId() on null in /vagrant/sites/phoenix.vagrant.dev/releases/20171206165245359550/lib/internal/Magento/Framework/View/Model/Layout/Merge.php:751 Stack trace:#0 /vagrant/sites/phoenix.vagrant.dev/releases/20171206165245359550/lib/internal/Magento/Framework/View/Model/Layout/Merge.php(684): Magento\Framework\View\Model\Layout\Merge->_getPhysicalTheme(Object(Magento\Theme\Model\Theme))#1 /vagrant/sites/phoenix.vagrant.dev/releases/20171206165245359550/lib/internal/Magento/Framework/View/Model/Layout/Merge.php(633): Magento\Framework\View\Model\Layout\Merge->_loadFileLayoutUpdatesXml()#2 /vagrant/sites/phoenix.vagrant.dev/releases/20171206165245359550/var/generation/LinusShops/Common/Model/Layout/Merge/Interceptor.php(245): Magento\Framework\View\Model\Layout\Merge->getFileLayoutUpdatesXml()#3 /vagrant/sites/phoenix.vagrant.dev/releases/20171206165245359550/lib/internal/Magento/Framework/View/Model/Layout/Merge.php(527): LinusShops\Common\Model\Layout\Merge\Intercep in /vagrant/sites/phoenix.vagrant.dev/releases/20171206165245359550/lib/internal/Magento/Framework/View/Model/Layout/Merge.php on line 751This can all be traced through the
_getPhysicalTheme
method. It’s ridiculous that this even occurs. The physical presence of a theme should just break the site in a very expected way: that is, the frontend just doesn’t appear. Don’t try to be clever and modify the DB. Magento design decisions never cease to amaze me.You can imagine what this means for anyone migrating their databases to a new host. For example, you import your DB dump to a new host. Once the DB is migrated, you then issue the standard
magento setup:install
command. Guess what? Now your theme will never build. Why? Because the theme itself did not physically exist on the filesystem at the time of the install. What is supposed to come first, Magento–the chicken or the egg?
Lorsque j’ai rencontré le problème, j’avais effectivement des thèmes dont le type
était seté à 1
dans la table theme
de ma base de données. J’ai dû, à la main:
- les repasser à
0
- vérifier (et reconfigurer si besoin) leur parenté
Avant modification:
Après modification:
Fichiers app/etc/config.php
et app/etc/env.php
ATTENTION: vérifier également dans les fichiers app/etc/config.php
et app/etc/env.php
si le type
n’est pas seté à 1
pour vos thèmes et corriger le cas échéant.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
'themes' => [ 'frontend/Sm/themecore' => [ 'parent_id' => 'Magento/blank', 'theme_path' => 'Sm/themecore', 'theme_title' => 'Sm Theme Core', 'is_featured' => '0', 'area' => 'frontend', 'type' => '1', 'code' => 'Sm/themecore' ], 'frontend/Sm/venuse' => [ 'parent_id' => 'Sm/themecore', 'theme_path' => 'Sm/venuse', 'theme_title' => 'Sm Venuse', 'is_featured' => '0', 'area' => 'frontend', 'type' => '1', 'code' => 'Sm/venuse' ], |
Vérifier votre version de node et l’upgrader/downgrader au besoin
La version de node qui fonctionne est la 8.12.0. Perso, mon Dockerfile était configuré sur latest.
Maintenant, tout dépend de la manière dont vous utilisez node. Voici comment mettre à jour Node et NPM proprement sous Ubuntu (ligne de commande) si la dépendance est installée en local sur votre machine.
Si vous utilisez Docker, il faut utiliser l’image node:8.12.0
au lieu de (pour moi) node:latest
dans votre fichier Dockerfile.
Puis lancer un docker-compose build
(pas besoin de down
vos containers au préalable).
Puis docker-compose down
et docker-compose up -d --force-recreate <nom_du_container>
(exemple: docker-compose up -d --force-recreate node
).
Si vous avez un script bash à sourcer (. ./docker/set-env.sh
par exemple…) qui initialise un environnement de développement (avec des aliases pour accéder aux containers ou à certaines commandes, ou autre…), il faut également le ré-exécuter.
Attention: une fois la mise à jour de Node effectuée, il convient de repartir d’une installation fraîche du dossier node_modules (suppression du dossier et npm install
.
Utiliser @magento_import
à la place de @import
dans vos sources LESS pour importer les fichiers que Grunt ne trouve pas
Le @magento_import est pour chercher tous les fichiers qui correspondent au path. par exemple:
1 |
//@magento_import 'source/_module.less'; |
va chercher tous les fichiers _module.less dans les sous dossier du thème.
Dans mon cas, les erreurs se trouvaient dans la section Theme Core
des fichiers styles-m.less
de vos thèmes parent et enfant, remplacer @import
par @magento_import
pour charger les fichiers que Grunt ne trouve pas.
ATTENTION: il est impératif de laisse les lignes @magento_import
en commentaire //
!
Exemple:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// Theme Core // --------------------------------------------- //@import 'source/jquery.fancybox/_jquery.fancybox.less'; //@import 'source/owlcarousel/_owl.carousel.less'; //@import 'source/owlcarousel/_owl.theme.default.less'; //@import 'source/owlcarousel/_animate.less'; //@import 'source/core_styles/_theme_core_layout.less'; //@import 'source/core_styles/detail/_tab.less'; //@import 'source/core_styles/_styles.less'; //@magento_import 'source/jquery.fancybox/_jquery.fancybox.less'; //@magento_import 'source/owlcarousel/_owl.carousel.less'; //@magento_import 'source/owlcarousel/_owl.theme.default.less'; //@magento_import 'source/owlcarousel/_animate.less'; //@magento_import 'source/core_styles/_theme_core_layout.less'; //@magento_import 'source/core_styles/detail/_tab.less'; //@magento_import 'source/core_styles/_styles.less'; |