Groupes de correctifs

Vous pouvez développer des groupes de correctifs ou des modules de correction dans une application de base à l'aide de Rational Team Concert.

Deux schémas sont possibles pour déployer l'édition d'une application : vous pouvez remplacer tous les objets de l'application ou uniquement les objets que vous avez modifiés. De nombreuses applications sur IBM® i sont déployées au moyen de l'installation de modules de correction ou correctifs sur un ensemble d'objets de base. Cet ensemble de nouveaux objets est appelé "groupe de correctifs". Au fur et à mesure qu'une application progresse dans les éditions, elle accumule un ensemble de groupes de correctifs et avec le temps, il peut y avoir plusieurs groupes de correctifs pour une base spécifique. Ces groupes de correctifs peuvent être construits pour être appliqués en série ou être cumulés. Vous pouvez aussi construire des groupes de correctifs de telle sorte qu'ils remplacent des objets existants, ou définir le chemin de recherche de la liste des bibliothèques de façon que les groupes de correctifs soient résolus à la place des objets existants.

Prenons l'exemple suivant. Une application contient un certain nombre de programmes, fichiers et autres objets résidant tous dans un ensemble réduit de bibliothèques. Ces bibliothèques se trouvent toutes dans une liste de bibliothèques lorsqu'un utilisateur exécute l'application. Un groupe de correctifs appliqué à l'application remplace certains des objets de ces bibliothèques par de nouvelles versions, laissant intacts les autres objets. En raison de la liaison tardive dans les programmes de service d'ILE et les programmes de l'OPM en général, le remplacement de ces objets donne lieu à une nouvelle version de l'application.

Une autre solution consiste à placer les bibliothèques du groupe de correctifs avant l'application de base dans la liste des bibliothèques et de procéder à la liaison dynamique à l'aide de la liste de bibliothèques. Si la liaison complète est effectuée à l'aide de la liste de bibliothèques, le groupe de correctifs est en fait appliqué sans qu'aucun des objets de la bibliothèque de base ne soit remplacé.

Vous pouvez utiliser Rational Team Concert pour construire l'un ou l'autre type de groupe de correctifs.

Exemple

Une application peut être divisée en projets pour lesquels la source de chaque projet est stockée dans les fichiers source d'une seule bibliothèque IBM i. Les objets créés à partir de cette source sont créés dans une bibliothèque d'objets qui peut être identique à la bibliothèque source. Un groupe de correctifs se compose de deux jeux d'objets dans cette bibliothèque d'objets :
  • Les objets créés à partir de la source qui a été modifiée en fonction de la bibliothèque de base ;
  • Les objets créés à partir de la source dans la bibliothèque de base qui dépend d'un des membres source modifiés.

Dans cet exemple, supposons que nous ayons deux bibliothèques source, FIX et BASE. Pour plus de simplicité, nous supposerons aussi que les objets de l'application sont créés directement dans la bibliothèque FIX. Le fichier source BASE/QRPGLESRC contient les membres A et B. Le fichier source BASE/QRPGLEINC contient le membre I. I est un membre inclus à la fois par A et B. Dans cet exemple, toutes les sources d'inclusion sont placées dans QRPGLEINC et reçoivent le type de source RPGLE. Nous considérerons que BASE est en lecture seule. Toutes les modifications sont effectuées dans la bibliothèque FIX. Supposons également que la bibliothèque BASE contienne tous les objets créés à partir de la source dans BASE et que la bibliothèque FIX contienne les objets qui constitueront le groupe de correctifs. A l'origine, FIX est vide.

Remarque : Le compilateur RPG comporte une instruction /INCLUDE, dont la syntaxe est /INCLUDE nom_bibliothèque/nom_fichier,nom_membre. Le nom de la bibliothèque par défaut est *LIBL. Le nom de fichier par défaut est QRPGLESRC. Le nom de membre est obligatoire. Dans cet exemple, nous supposerons que le nom de la bibliothèque est *LIBL car le membre inclus peut se trouver dans la bibliothèque FIX ou la bibliothèque BASE.

La programmeuse souhaite modifier QRPGLESRC(A). Pour ce faire, elle doit copier QRPGLESRC(A) de la bibliothèque BASE dans la bibliothèque FIX. Elle effectue la copie et modifie le membre. Une génération doit créer le module FIX/A à partir de cette source.

La programmeuse souhaite maintenant modifier QRPGLEINC(I). Elle copie ce fichier QRPGLEINC(I) de la bibliothèque BASE à la bibliothèque FIX et effectue la modification. Une génération doit maintenant créer le module FIX/A à partir de cette source mais également créer le module FIX/B. Il n'y a pas de module associé à QRPGLEINC(I) même si ce dernier est de type RPGLE car il s'agit d'un membre inclus qui ne doit pas être compilé.

L'organisation du projet, la configuration de la génération et le processus de génération doivent être assez souples pour déterminer les points suivants :

Organisation du projet

Dans cet exemple, l'organisation du projet de base dans la prise en charge des projets i dans Rational Developer for Power Systems Software est très simple. Nous avons un projet unique avec deux fichiers source : QRPGLESRC et QRPGLEINC. Chaque fichier source contient les membres mentionnés ci-dessus. Notez qu'il n'y a qu'un seul projet. Etant donné que le référentiel conserve une trace de l'historique complet de ce projet, son contenu peut varier à travers le temps. Il n'est pas nécessaire d'établir un projet séparé pour appliquer une extension ou un correctif à une application.

Il est possible de partager ce projet dans un flux de référentiel. A l'intérieur de ce flux, nous créerons un instantané qui sera la base de cette application. Dans cet exemple, nous supposerons que la bibliothèque BASE a déjà été remplie.

A mesure que nous apporterons des modifications à l'application, le flux mettra en attente les modifications effectuées. Nous associons à ce flux un espace de travail de génération et sa définition de génération. La définition de génération aura pour bibliothèque de chargement et d'objets la bibliothèque FIX sur IBM i. Cette définition de génération considère la bibliothèque BASE comme seule bibliothèque de référence dans sa définition de génération.

Chargement de la bibliothèque FIX

Avant qu'une génération soit soumise, le processus de chargement d'instantané tient synchronisés la bibliothèque FIX et l'espace de travail de génération. Au fur et à mesure que des modifications sont apportées au flux, elles sont transmises à son espace de travail de génération et de là à la bibliothèque FIX sur le système IBM i. Toutefois, puisque nous avons établi un instantané de base, seuls les fichiers qui sont différents de la base seront chargés dans la bibliothèque FIX.

Dans notre exemple, la programmeuse apporte une modification au fichier QRPGLESRC(A), puis transmet la modification au flux, ce qui achemine la modification dans l'espace de travail de génération. Puisqu'il s'agit d'une modification de la base, le membre est alors chargé dans la bibliothèque FIX sur le système IBM i. De même, QRPGLEINC(I) a été modifié et est transféré dans la bibliothèque FIX. Notre bibliothèque FIX contient maintenant deux membres source.

Liste des bibliothèques au cours de la génération

Une liste de bibliothèques se compose de quatre sections : la liste des bibliothèques système, la bibliothèque en cours, une ou deux bibliothèques produit et la liste des bibliothèques utilisateur. Pour l'instant, nous ignorerons les sections système et produit de la liste de bibliothèques. La bibliothèque en cours est une bibliothèque unique. La liste des bibliothèques utilisateur se compose de plusieurs bibliothèques. Une bibliothèque peut être la bibliothèque en cours et également apparaître dans la liste des bibliothèques utilisateur, mais il ne peut pas y avoir de doublons dans la liste des bibliothèques utilisateur.

Si nous utilisons notre exemple précédent, il est clair que nous avons à effectuer la compilation vers la bibliothèque FIX. Elle doit être notre bibliothèque en cours. Toutes les commandes create créeront des objets dans cette bibliothèque par défaut. Puisque nous compilons des objets dans la bibliothèque FIX, nous l'indiquons dans notre définition de génération.

La bibliothèque BASE doit également figurer dans la liste des bibliothèques afin que les membres puissent être détectés par les compilateurs. Il s'agit de la seule bibliothèque de la liste des bibliothèques utilisateur. Nous la définissons comme bibliothèque de référence dans notre définition de génération.

La liste des bibliothèques peut également contenir d'autres bibliothèques en plus de la bibliothèque BASE. Cependant, nous voulons rechercher les candidats à la compilation dans les bibliothèques FIX et BASE uniquement, et non dans les bibliothèques suivantes.

Spécification de génération

La spécification de génération régit le processus de génération en décrivant ce qui est généré et comment cela doit être généré. Dans notre exemple, la spécification de génération du projet possède deux jeux de commandes : un jeu pour ILE RPG et un jeu pour créer tous les programmes à partir des modules. La spécification de génération possède également deux générateurs, l'un pour décrire ce qu'il faut compiler pour RPG et l'autre pour créer le programme. D'ordinaire nous pourrions réutiliser les jeux de commandes avec plusieurs générateurs, mais comme il s'agit d'un simple exemple, il n'y a pas de réutilisation.

En résumé, nous disposons du fichier QRPGLESRC(A) de type source RPGLE dans les deux bibliothèques FIX et BASE. Nous disposons de QRPGLEINC(I) de type source RPGLE dans les bibliothèques FIX et BASE. Nous avons QRPGLESRC(B) dans la bibliothèque BASE. A et B incluent tous deux I.

Le processus de génération doit examiner tous les candidats à la compilation dans le fichier QRPGLESRC de type RPGLE. Etant donné que la liste des bibliothèques peut contenir des bibliothèques autres que FIX et BASE, nous décrivons la liste des candidats à l'aide de la variable spéciale &SP. Celle-ci contient les bibliothèques provenant du projet, dans lesquelles doit être recherchée la source à compiler. Dans notre cas, &SP est défini par le moteur de génération comme la liste (FIX BASE).

Dans notre définition de générateur, nous définissons l'expression des candidats à la compilation comme suit :

Nous définissons également la liste des dépendances éventuelles comme suit :

En appliquant la première expression à notre exemple, nous obtenons les candidats de compilation suivants après que FIX/QRPGLESRC(A) a été créé et modifié :

En appliquant la seconde expression à notre exemple, nous obtenons la liste de dépendances suivantes pour ces candidats :

Ainsi, modifier QRPGLEINC(I) a pour résultat que FIX/QRPGLESRC(A) et BASE/QRPGLESRC(B) procèdent à la compilation en créant les modules FIX/A et FIX/B. Si vous ne modifiez que QRPGLESRC(A), seul FIX/QRPGLESRC(A) procédera à la compilation en créant le module FIX/A. Par conséquent, la bibliothèque FIX ne contiendra que les modules nécessaires au groupe de correctifs.

Voir Jazz.net pour plus d'informations.


Retour d'informations