Skip to Content

Créer un dépôt d'extensions pour QGIS


Une fois le plus dur fait (la création d'une extension QGIS en Pyhton), pourquoi ne pas en faire profiter la terre entière ?

Il y a plusieurs manières de le faire, à commencer par proposer le code de l'extension en téléchargement sur un forum, un blog, une page perso, etc. C'est bien mais il est possible de faire beaucoup mieux !

QGIS dispose d'un système de récupération d'extensions qui permet de scanner une série de dépôts, de récupérer les extensions qui y sont stockées et de les installer ou de les mettre à jour. Ce système permet donc aux développeurs de diffuser automatiquement aux utilisateurs ses extensions et leurs mises à jour.

Les dépôts QGIS

Il y a plusieurs types de dépôt :

  • le dépôt officiel, "QGIS Official Repository" (http://pyqgis.org/repo/official) : il ne contient aujourd'hui que deux extensions dont l'indispensable "Plugin Installer"

  • le dépôt d'extensions dédié aux contributeurs, QGIS Contributed Repository (http://pyqgis.org/repo/contributed) : il contient une liste bien fournie d'extensions dont "Table manager" par exemple.

Ces deux dépôts sont déjà référencés dans QGIS au moment de l'installation mais le dépôt des contributeurs n'est pas activé par défaut.

Au delà de ces deux types de dépôt, il est possible d'en ajouter d'autre en fournissant une URL. Cette URL doit pointer sur un fichier XML qui liste les extensions du dépôt ainsi que quelques informations sur chaque extension.

Le dépôt : un fichier XML

Le fichier XML d'un dépôt doit respecter une structure bien précise. Voici un exemple de dépôt contenant une extension, la structure minimale conseillée que le fichier XML correspondant doit avoir est la suivante :

 

<?xml version = '1.0' encoding = 'ISO-8859-1'?>
<plugins>
     <pyqgis_plugin version="1.0" name="Mon extension" >
         <description>Un texte court décrivant l'extension</description>
         <homepage>
http://www.monsite.fr</homepage>
         <file_name>monextension.zip</file_name>
         <author_name>Mon Nom</author_name>
         <download_url>http://www.monsite.fr/qgis/plugins/monextension.zip</download_url>
         <qgis_minimum_version>1.0.0</qgis_minimum_version>
         <experimental>true</experimental>
      </pyqgis_plugin>
</plugins>


Pour chaque extension référencée dans le fichier XML, il faut donc indiquer :

  • le nom de l'extension, le même que celui donné dans le fichier __ini__.py,

  • le numéro de version de l'extension,

  • une courte description de l'extension,

  • le lien vers la page du projet (cette balise n'est pas indispensable),

  • le nom du fichier zip contenant le code de l'extension (cette balise n'est pas indispensable),

  • le ou les auteurs,

  • le lien vers le fichier zip qui contient le code de l'extension,

  • le numéro de version minimale de QGIS qu'il faut avoir pour faire fonctionner l'extension,

  • si le plugin est expérimental ou non ("true" ou "false").

En réalité, en plus du nom et de la version de l'extension, seules les balises "download_url" et "qgis_minimum_version" sont obligatoires.

Le fichier zip doit contenir l'ensemble des fichiers de code et tous les autres fichiers nécessaires au bon fonctionnement de l'extension (fichiers d'aide, images, etc.). Il faut retirer les fichiers python compilés (.pyc).

Dans cet exemple, une seule extension est présente dans le dépôt, elle est définie par les balises <pyqgis_plugin version="1.0" name="Mon extension" > et </pyqgis_plugin > ainsi que toutes celles comprises entre. Pour ajouter des extensions au dépôt il suffit donc d'ajouter ces ensembles de balises à l'intérieur de <plugins> </plugins> en respectant la même hiérarchie et de ne pas oublier d'ajouter les fichiers zip de chaque extension.

Ajouter le dépôt à QGIS

Le fichier XML ainsi que le ou les fichiers zip doivent être accessibles via internet. Il n'y a plus qu'à indiquer à QGIS l'adresse du fichier XML pour ajouter le dépôt et ses extensions. Cela ce fait dans le menu "Extension / Récupération des extensions en Python" puis onglet "Dépôt" bouton "Ajouter...". La fenêtre demande un nom du dépôt ainsi que l'URL qui pointe sur le fichier XML. La case "Activé" doit rester cochée. Ces informations pourront être éditées par la suite (bouton "Éditer...") et seront gardées en mémoire par QGIS pour les prochaines sessions.

Fenêtre permettant d'ajouter un dépôt d'extensions à QGIS

Si vous avez des extensions expérimentales, n'oubliez pas de cocher l'option  "Afficher toutes les extensions, même celles encore expérimentales" dans l'onglet "Options" pour qu'elles apparaissent dans la liste des extensions.

Fenêtre d'options de l'installateur d’extensions QGIS

Le dépôt est donc maintenant créé et ajouté à QGIS.

Mettre en forme la page du dépôt

Il est possible d'aller plus loin et de créer une véritable page internet à partir du fichier XML, ce qui permettra de présenter le dépôt de manière plus esthétique qu'un simple fichier texte ou de l'intégrer à un site internet existant. Il s'agit ici d'utiliser le fichier XSL dont le lien est à rajouter en entête du fichier XML :

 

<?xml version = '1.0' encoding = 'ISO-8859-1'?>
<?xml-stylesheet type="text/xsl" href="http://www.monsite.fr/qgis/plugins/depot.xsl" ?>


Ce fichier se présente comme un fichier html avec ses balises header, body etc. et il va permettre d'extraire les informations voulues du fichier XML et de les mettre en forme.

page de dépôt qgis

  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2.  
  3. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  4.  
  5. <xsl:template match="/plugins">
  6.  
  7.  
  8.  
  9.  
  10. <title>Le titre de ma page internet</title>
  11.  
  12. </head>
  13.  
  14.  
  15. <xsl:for-each select="/plugins/pyqgis_plugin">
  16.  
  17. <div class="plugin">
  18.  
  19. <div class="head">
  20.  
  21. <xsl:value-of select="@name" /> : <xsl:value-of select="@version" />
  22.  
  23. </div>
  24.  
  25. <div class="description">
  26.  
  27. <xsl:value-of select="description" />
  28.  
  29. </div>
  30.  
  31. <div class="download">
  32.  
  33. Download:
  34.  
  35. <xsl:element name="a">
  36.  
  37. <xsl:attribute name="href">
  38.  
  39. <xsl:value-of select="download_url" />
  40.  
  41. </xsl:attribute>
  42.  
  43. <xsl:value-of select="file_name" />
  44.  
  45. </xsl:element>
  46.  
  47. </div>
  48.  
  49. <div class="author">
  50.  
  51. Author: <xsl:value-of select="author_name" />
  52.  
  53. </div>
  54.  
  55. <div class="QGISversion">
  56.  
  57. QGIS minimum version needed: <xsl:value-of select="qgis_minimum_version" />
  58.  
  59. </div>
  60.  
  61. <div class="experimental">
  62.  
  63. Experimental: <xsl:value-of select="experimental" />
  64.  
  65. </div>
  66.  
  67. </div>
  68.  
  69. </xsl:for-each>
  70.  
  71. </body>
  72.  
  73. </html>
  74.  
  75.  
  76. </xsl:template>
  77.  
  78. </xsl:stylesheet>

 

Il reste à préciser le style de la page. Pour cela, le plus simple est de créer un fichier css qui contiendra les éléments de style (couleurs, polices, marges, etc.) et d'ajouter le lien vers ce fichier dans la balise "head" du fichier XSL :

 

<head>

  <title>Le titre de ma page internet</title>

  <link rel="stylesheet" href="xsl.css" type="text/css" />

</head>

 

Voici un exemple de fichier css simple :

 

css pour dépôt QGIS

  1. body {
  2.  
  3. font-family:Verdana, Arial, Helvetica, sans-serif;
  4.  
  5. width: 50em;
  6.  
  7. }
  8.  
  9. div.plugin {
  10.  
  11. background-color:#FFFFDF;
  12.  
  13. clear:both;
  14.  
  15. display:block;
  16.  
  17. padding:0 0 0.5em;
  18.  
  19. margin:1em;
  20.  
  21. }
  22.  
  23.  
  24. div.head {
  25.  
  26. background-color:#426b81;
  27.  
  28. border-bottom-width:0;
  29.  
  30. color:#FFF;
  31.  
  32. display:block;
  33.  
  34. font-size:110%;
  35.  
  36. font-weight:bold;
  37.  
  38. margin:0;
  39.  
  40. padding:0.3em 1em;
  41.  
  42. }
  43.  
  44.  
  45. div.description{
  46.  
  47. display: block;
  48.  
  49. float:none;
  50.  
  51. margin:0;
  52.  
  53. text-align: left;
  54.  
  55. padding:0.2em 0.5em 0.4em;
  56.  
  57. color: black;
  58.  
  59. font-size:100%;
  60.  
  61. font-weight:normal;
  62.  
  63. }
  64.  
  65.  
  66. div.download, div.author, div.experimental, div.QGISversion{
  67.  
  68. font-size: 80%;
  69.  
  70. padding: 0em 0em 0em 1em;
  71.  
  72. }

Pour étoffer la présentation des extensions de ce dépôt, il est possible de rajouter des informations au fichier XML en suivant la même logique que pour les autres éléments. Ces éléments d'informations supplémentaires ne seront pas utilisés dans QGIS mais pourront s'afficher sur la page internet du dépôt.


Site officiel : QGIS
Autres Liens : La page des dépôts QGIS

Commentaires

Attention avec file_name

Merci pour ce tutoriel !

Après avoir cherché 5 heures pourquoi ton exemple ne fonctionnait pas (dans mon cas), j'ai fini par comprendre...
Premièrement il faut que le zip ai un répertoire racine "monextension" sinon il colle tous les fichiers à la racine des plugins.

J'ai mis la version sur mon fichier, par exemple monextension_1.0.zip

ce qui donne :
<?xml version = '1.0' encoding = 'ISO-8859-1'?>
<plugins>
<pyqgis_plugin version="1.0" name="Mon extension" >
<description>Un texte court décrivant l'extension</description>
<homepage>http://www.monsite.fr</homepage>
<file_name>monextension_1.0.zip</file_name>
<author_name>Mon Nom</author_name>
<download_url>http://www.monsite.fr/qgis/plugins/monextension_1.0.zip</download_url>
<qgis_minimum_version>1.0.0</qgis_minimum_version>
<experimental>true</experimental>
</pyqgis_plugin>
</plugins>

Et cela ne fonctionne pas. En effet, une fois le plugin installé, QGis ne le trouve pas, il affiche le message :
The plugin seems to have been installed but I don't know where. Probably the plugin package contained a wrong named
directory.\nPlease search the list of installed plugins. I'm nearly sure you'll find the plugin there, but I just can't determine which of them it is. It also means that I won't be able to determine if this plugin is installed and inform you about available updates. However the plugin may work. Please contact the plugin author and submit this issue."

après avoir cherché et debugger QGis, j'ai fini par comprendre qu'il cherchait le plugin non pas à l'emplacement monextension mais à monextension_1 : il tronque tout ce qu'il y a après le '.' de la balise <file_name>.

Dans mon cas, il suffit de remplacer par :
<?xml version = '1.0' encoding = 'ISO-8859-1'?>
<plugins>
<pyqgis_plugin version="1.0" name="Mon extension" >
<description>Un texte court décrivant l'extension</description>
<homepage>http://www.monsite.fr</homepage>
<file_name>monextension</file_name>
<author_name>Mon Nom</author_name>
<download_url>http://www.monsite.fr/qgis/plugins/monextension_1.0.zip</download_url>
<qgis_minimum_version>1.0.0</qgis_minimum_version>
<experimental>true</experimental>
</pyqgis_plugin>
</plugins>

A quoi sert file_name réélement ? Aucune idée mais c'est ce qu'il y a dans cette balise qui est utilisé comme chemin racine de QGis lors de l'installation...

Poster un nouveau commentaire

Le contenu de ce champ sera maintenu privé et ne sera pas affiché publiquement.