PnX-SI / GeoNature

Application de saisie et de synthèse des observations faune et flore
GNU General Public License v3.0
103 stars 102 forks source link

Impossible de charger les "assets" des modules externes #2957

Open TheoLechemia opened 7 months ago

TheoLechemia commented 7 months ago

Les "assets" fournis par les modules externes ne sont plus chargés. Le fichier angular.json est configuré pour les servir à la racine du projet : https://github.com/PnX-SI/GeoNature/blob/master/frontend/angular.json#L36 :

              {
                "glob": "**/*",
                "input": "external_modules/*/assets/",
                "output": "./assets/"
              }

la wildcard dans input ne semble pas fonctionner (même en rajoutant un followSymlinks:true)

Solution de contournement - à voir si on fait comme ça : faire un lien symbolique des assets du module externe vers le dossier frontend/assets du coeur et modifier le fichier angular.json comme suit :

             "assets": [
               "src/favicon.ico",
-              "src/assets"
+              {
+                "followSymlinks": true,
+                "input": "src/assets",
+                "glob": "**/*",
+                "output": "/assets/"
+              }
             ], 
jpm-cbna commented 2 months ago

Correction rapide

Une autre solution consiste à essayer de réactiver le fonctionnement précédent (ou presque). Le problème c'est qu'Angular ne supporte plus les "wildcard" (*) dans le chemin du paramètre input. Il est nécessaire d'utiliser les "wildcard" dans le paramètres glob. De plus, pour suivre les liens symboliques des modules présent dans le dossier frontend/external_modules/, il faut mettre le paramètre followSymlinks à true.

Pour cela, il suffit de remplacer le code actuel:

{
  "glob": "**/*",
  "input": "external_modules/*/assets/",
  "output": "./assets/"
}

par ceci:

{
  "followSymlinks": true,
  "glob": "**/assets/**/*",
  "input": "./external_modules/",
  "output": "/assets/"
}

Au final, si j'ai dans frontend/external_modules/ un module nommé sht, je vais avoir le chemin frontend/external_modules/sht/assets/ vers mon fichier marker-icon.png.

Lorsque j'applique la nouvelle règle, après l'utilisation de npm run build, je me retrouve dans le dossier frontend/dist/ avec frontend/dist/assets/sht/assets/marker-icon.png L'URL à utiliser, par rapport à la racine de mon site, pour accéder à mon fichier sera : /assets/sht/assets/marker-icon.png.

Solution alternative

J'ai fait quelques recherches et il ne me semble pas possible de "supprimer" le deuxième dossier assets/. Si l'on veut éviter cette répétition, il est possible de modifier le chemin de sortie pour obtenir par exemple: /modules/sht/assets/marker-icon.png Dans ce cas là, la config serait:

{
  "followSymlinks": true,
  "glob": "**/assets/**/*",
  "input": "./external_modules/",
  "output": "/modules/"
}

Solution plus longue

Une alternative reprenant la solution proposait par @TheoLechemia est de créer un dossier contenant exclusivement des liens symboliques vers les dossiers assets de chaque module. Il pourrait être placé dans le dossier frontend/external_modules/assets/. Je me retrouverai donc avec frontend/external_modules/assets/*sht*/marker-icon.png et dans le dossier de sortie frontend/dist/assets/sht/marker-icon.png soit l'URL /assets/sht/marker-icon.png Dans ce cas là, la config serait:

{
  "followSymlinks": true,
  "glob": "**/*",
  "input": "./external_modules/assets/",
  "output": "/assets/"
}

Le problème c'est qu'il faut modifier le fonctionnement de l'installation des modules pour créer ces nouveaux liens symboliques.

Conclusion

Dans tous les cas, nous sommes obligé à minima de changer le chemin des assets des modules pour corriger le problème.

Ressources:

TheoLechemia commented 2 months ago

Ta première solution me semble meilleur que de devoir refaire un lien symbolique à la main

jpm-cbna commented 2 months ago

J'ai corrigé le paramètre glob pour que tous les sous-dossiers présents dans le dossier assets des modules externes soient pris en compte.