Question
· Oct 4, 2023

Exécutions d'un script dans un terminal Iris sans GUI

Bonjour,

Nous voulons créer une CD pour InterSystems. Nous avons créé un script IRIS qui permet de compiler automatiquement les fichiers .cls dans les bons namespaces et pour exécuter ce script, nous faisons la commande: iristerm /console=cn_ap:IRIS .\import.scr'

Cependant, cela va nous ouvrir un terminal IRIS dans une nouvelle fenêtre (GUI). Le problème, c'est que nous passons par un user SSH, en exécutant la commande : 

ssh user@hostname 'E: && iristerm /console=cn_ap:IRIS .\import.scr'

, cela ne fonctionne pas, nous supposons que c'est à cause de ce GUI qui est censé s'ouvrir, mais sans interface graphique c'est compliqué.

Nous n'avons pas trouvé de moyen pour ouvrir le terminal sans GUI ou même d'exécuter ce script d'une autre manière (et automatiquement pour la CD). 

Il s'agit d'un script écrit comme vous pouvez retrouver la documentation ici.

Si quelqu'un a une idée, nous sommes preneurs.

Merci d'avance !

Version du produit: IRIS 2022.1
$ZV: IRIS for Windows (x86-64) 2022.1 (Build 209U) Tue May 31 2022 12:16:40 EDT
Discussion (5)2
Connectez-vous ou inscrivez-vous pour continuer

Bonsoir @Jean-Charles Cano ,

Avez-vous déjà essayé avec runw?  Voici un exemple de structure de la commande pour démarrer une classmethod:  

iris runw INSTANCENAME ##class(Package.Class).ClassMethod(\"argument\") NAMESPACE

L'exe iris se trouve dans le sous répertoire bin de l'instance IRIS.

pour démarrer un terminal en ligne de commande utilisez irissession:

irissession INSTANCENAME -U NAMESPACE

# ex:
irissession IRIS -U USER

# il est également possible de démarrer un programme, ex:

irissession IRIS -U %SYS ^%SS

Bonjour @Lorenzo Scalese,

Le problème de la commande iris runw c'est que nous allons éxecuter une classe dans un namespace, cependant, nous voulons à partir d'un script (ou de cette classe si c'est possible) compiler plusieurs fichiers cls provenant de répertoires précis sur la machine (pas importés dans InterSystems), dans des namespaces différents (plus d'une dizaine).

Nous avons pas mal de difficultés sur la compréhension de l'éxecution d'un script, pouvez-vous nous fournir plus de détails concernant runw ou même un exemple afin qu'on puisse voir comment changer de namespace et compiler.

Merci beaucoup !

Cyril

PS : Pour le script il s'agit d'un script réalisé en suivant cette page de la documentation : https://docs.intersystems.com/irisforhealth20232/csp/docbook/DocBook.UI....

Bonjour @Cyril Grosjean ,

Je devrais pouvoir vous fournir quelques informations pouvant vous être utile.

Dans ma boîte, entre d'autres choses, je m'occupe de l'écriture de scripts de deploy pour nos environnements internes.

La solution que je pense la plus simple est d'écrire une classe (ou une routine) qui sera votre script principal pour toutes les actions à effectuer.  

Le tuto que vous avez suivi, n'est pas vraiment adapté.  Il y a quelques années, je l'ai testé par curiosité, mais c'est vraiment pour faire de l'émulation terminal.

Voici un exemple de classe qui se positionne sur un namespace, charge et compile un répertoire:

Class dc.DeployDemo
{

ClassMethod deploy(
	sourceDirectory As %String,
	targetNameSpace As %String)
{
    Set startNameSpace = $Namespace

    Write !, $ZDateTime($Horolog, 3, 1) _ " Start deploy"

    ; L'utilisation du new $namespace permet au système 
    ; de revenir automatiquement sur le namspace d'origine en quittant la méthode
    New $Namespace

    Set $Namespace = targetNameSpace
    
    Write !, $ZDateTime($Horolog, 3, 1) _ " Switch to namespace "_$Namespace

    Write !, $ZDateTime($Horolog, 3, 1) _ " Load and compile directory " _ sourceDirectory

    ; le 4ème argument permet de faire un chargement récursif (inclusion des sous répertoires)
    Set sc = $SYSTEM.OBJ.LoadDir(sourceDirectory, "ck", , 1)

    Set msgStatus = $Select($$$ISERR(sc):$SYSTEM.Status.GetOneErrorText(sc),1:"OK")

    Write !, $ZDateTime($Horolog, 3, 1) _ " Status " _ msgStatus

    Quit
}

}

Préparer ensuite un fichier texte contenant le code à exécuter (pour l'exemple le fichier texte est c:\dev\script.txt): 

Do ##class(dc.DeployDemo).deploy("c:\src\cls","namespace")
Halt

dès que le fichier est prêt, vous pouvez utiliser irissession et y injecter les commandes:

irissession IRIS -U USER < c:\dev\script.txt

Ceci reste qu'un exemple assez basic, n'hésitez pas à me contacter sur Discord, nous pourrons échanger verbalement plus rapidement sur le sujet si vous le souhaitez.

Lorenzo.