2013-05-24 8 views
6

Nasz zespół używa do repozytorium Enterprise Architect version 10 i SVN. Ponieważ rozmiar pliku EAP jest dość duży (na przykład 80 MB), eksportujemy każdy pakiet do osobnego XMI i zapisujemy go w postaci SVN. Sam plik EAP jest zatwierdzany po pewnym etapie. Problem polega na synchronizacji pliku EAP z pracą od współautora podczas programowania. Musimy zaimportować wiele plików o rozmiarze XMI (np. Całkowita liczba plików może wynosić 500).Wydajny sposób na importowanie pliku XMI w Enterprise Architect

Wiem, że po zaktualizowaniu pliku EAP możemy użyć Kontroli pakietów -> Pobierz wszystko najnowsze. Dlatego problem ten występuje tylko podczas równoległego rozwoju.

Użyliśmy shorcuts klawiaturowych zrobić import następująco:

  1. Ctrl + Alt + I (pakiet Import z XMI pliku)
  2. Wybierz nazwę pliku do importu
  3. Alt + I (Import)
  4. Wprowadź (Yes)
  5. Powtórz krok numer 2 do 4, aż moduł zakończeniu

ale nadal, importowanie setki pliku jest nieefektywne.

Sprawdziłem, czy pakiet sterowania ma funkcję importu/eksportu partii. Import/eksport wsadowy działa, gdy jawnie zakodowałem kod XMI Filename, ale opcje nie są dostępne, jeśli używasz kontroli wersji (opcje importu/eksportu partii są szare).

Czy są jakieś lepsze sposoby synchronizowania plików EAP i XMI?

Odpowiedz

4

Istnieje interfejs scripting w EA. Możesz zautomatyzować importowanie za pomocą tego. Nie użyłem go, ale prawdopodobnie jest całkiem niezły.

Nie jestem pewien, czy w pełni rozumiem twoje środowisko pracy, ale mam pewne ogólne uwagi, które mogą być interesujące. Może się zdarzyć, że jeśli użyjesz EA w inny sposób (szczególnie mój pierwszy punkt poniżej), potrzeba importu grupowego może zniknąć.

Multiworker

Po pierwsze, wiele osób może pracować na tym samym pliku EAP na raz. Plik EAP to nic innego jak plik bazy danych programu Access, a EA używa funkcji blokowania, aby zatrzymać jednoczesne edytowanie tego samego pakietu przez wiele osób. Ale możesz wygodnie mieć wiele osób edytujących różne pakiety w jednym pliku EAP w tym samym czasie. Umieszczenie pliku EAP w udziale plików jest dobrym sposobem na zrobienie tego.

Wbudowana kontrola Weryfikacja

drugie, EA może oddziaływać bezpośrednio z SVN (i innych systemów kontroli wersji). Zobacz this.Krótko mówiąc, możesz ustawić swój plik EAP, tak aby poszczególne pakiety (i wszystko poniżej) były kontrolowane przez SVN. Możesz następnie wyewidencjonować indywidualny pakiet, edytować go, ponownie go sprawdzić. Lub rzeczywiście możesz sprawdzić cały oddział pod pakietem (w tym pakiety podrzędne, które same są kontrolowane przez SVN).

Pod maską EA importuje i eksportuje pliki XMI oraz sprawdza je i wylogowuje z SVN, podczas gdy plik EAP jest zawsze wersją główną. Tak jak to, co robisz ręcznie, ale zautomatyzowane. Ma to sens, biorąc pod uwagę, że wszyscy mogą korzystać z jednego pliku EAP. Musisz być nieco ostrożnym wycofywaniem - linki pochodzące z obiektów w starszych wersjach jednego pakietu mogą wskazywać na obiekty, które już nie istnieją (ale możesz spojrzeć na błędy dziennika importu, aby sprawdzić, czy tak jest). Trochę się przyzwyczaić, ale działa całkiem nieźle.

Istnieje również wbudowana funkcjonalność baselining pakietów - to może być wszystko, czego potrzebujesz i tak działa całkiem dobrze, zwłaszcza jeśli wszyscy używasz tego samego pliku EAP.

Bigger Database Engine

Po trzecie, nie trzeba mieć plik EAP w ogóle. Baza danych modelu może znajdować się w dowolnym odpowiednim systemie baz danych (MySQL, SQL Server, Oracle itp.). Daje to ci wiele możliwości skalowania tego, jak jest używany, jak to jest w sieciach WAN/Internecie itp.

W skrócie Sparx był dość rozsądny, jeśli chodzi o wykorzystanie EA w środowisku wielozakładowym, i warto to wykorzystać.

+0

Okay , pozwól mi sprawdzić skryptowanie i wbudowaną kontrolę wersji – David

+0

Wbudowana kontrola wersji jest podobna do tej, którą robiliśmy teraz. Nie ma problemu z odprawą pakietu do SVN i uzyskaniem eksportu XMI. Problem dotyczy pierwszego importu XMI, ponieważ każdy członek zespołu używa własnego pliku EAP. W przypadku skryptów widziałem tylko kilka przykładów i objaśnień :( – David

+0

Czy plik EAP członka zespołu jest nominalnie identyczny? Jeśli tak, możesz wybrać ten, który jest całkowicie aktualny (lub zrobić taki sam), przykleić go do udziału plików, a następnie każdy może porzucić własne i zacząć używać tego.Możesz następnie skonfigurować ten pojedynczy plik EAP, aby zintegrować się z SVN.Będziesz stracić ciągłość w historii zmian.Krótko sugeruję jednorazowy wysiłek, aby uzyskać jeden plik EAP, a następnie od teraz wbudowana automatyczna integracja SVN EA. – bazza

1

Stworzyłem skrypt EA korzystając JScript do automatyzacji

Oto skrypt, aby zrobić wywozu:

!INC Local Scripts.EAConstants-JScript 

/* 
* Script Name : Export List of SVN Packages 
* Author  : SDK 
* Purpose  : Export a package and all of its subpackages information related to version 
*    controlled. The exported file then can be used to automatically import 
*    the XMIs 
* Date  : 30 July 2013 
* HOW TO USE : 1. Select the package that you would like to export in the Project Browser 
*    2. Change the output filepath in this script if necessary. 
*     By default it is "D:\\EAOutput.txt" 
*    3. Send the output file to your colleague who wanted to import the XMIs 
*/ 

var f; 

function main() 
{ 
    // UPDATE THE FOLLOWING OUTPUT FILE PATH IF NECESSARY 
    var filename = "D:\\EAOutput.txt"; 

    var ForReading = 1, ForWriting = 2, ForAppending = 8; 

    Repository.EnsureOutputVisible("Script"); 
    Repository.ClearOutput("Script"); 
    Session.Output("Start generating output...please wait..."); 

    var treeSelectedType = Repository.GetTreeSelectedItemType(); 

    switch (treeSelectedType) 
    { 
     case otPackage: 
     { 
      var fso = new ActiveXObject("Scripting.FileSystemObject"); 
      f = fso.OpenTextFile(filename, ForWriting, true); 

      var selectedObject as EA.Package; 
      selectedObject = Repository.GetContextObject(); 
      reportPackage(selectedObject); 
      loopChildPackages(selectedObject); 

      f.Close(); 
      Session.Output("Done! Check your output at " + filename); 
      break; 
     } 
     default: 
     { 
      Session.Prompt("This script does not support items of this type.", promptOK); 
     } 
    } 
} 

function loopChildPackages(thePackage) 
{ 
    for (var j = 0 ; j < thePackage.Packages.Count; j++) 
    { 
     var child as EA.Package; 
     child = thePackage.Packages.GetAt(j); 
     reportPackage(child); 
     loopChildPackages(child); 
    } 
} 

function getParentPath(childPackage) 
{ 
    if (childPackage.ParentID != 0) 
    { 
     var parentPackage as EA.Package; 
     parentPackage = Repository.GetPackageByID(childPackage.ParentID); 
     return getParentPath(parentPackage) + "/" + parentPackage.Name; 
    } 
    return ""; 
} 

function reportPackage(thePackage) 
{ 
    f.WriteLine("GUID=" + thePackage.PackageGUID + ";" 
        + "NAME=" + thePackage.Name + ";" 
        + "VCCFG=" + getVCCFG(thePackage) + ";" 
        + "XML=" + thePackage.XMLPath + ";" 
        + "PARENT=" + getParentPath(thePackage).substring(1) + ";" 
    ); 
} 

function getVCCFG(thePackage) 
{ 
    if (thePackage.IsVersionControlled) 
    { 
     var array = new Array(); 
     array = (thePackage.Flags).split(";"); 

     for (var z = 0 ; z < array.length; z++) 
     { 
      var pos = array[z].indexOf('='); 

      if (pos > 0) 
      { 
       var key = array[z].substring(0, pos); 
       var value = array[z].substring(pos + 1); 

       if (key=="VCCFG") 
       { 
        return (value); 
       } 
      } 
     } 
    } 
    return ""; 
} 

main(); 

i skrypt zrobić import:

!INC Local Scripts.EAConstants-JScript 

/* 
* Script Name : Import List Of SVN Packages 
* Author  : SDK 
* Purpose  : Imports a package with all of its sub packages generated from 
*    "Export List Of SVN Packages" script 
* Date  : 01 Aug 2013 
* HOW TO USE : 1. Get the output file generated by "Export List Of SVN Packages" script 
*     from your colleague 
*    2. Get the XMIs in the SVN local copy 
*    3. Change the path to the output file in this script if necessary (var filename). 
*     By default it is "D:\\EAOutput.txt" 
*    4. Change the path to local SVN 
*    5. Run the script 
*/ 

var f; 
var svnPath; 

function main() 
{ 
    // CHANGE THE FOLLOWING TWO LINES ACCORDING TO YOUR INPUT AND LOCAL SVN COPY 
    var filename = "D:\\EAOutput.txt"; 
    svnPath = "D:\\svn.xxx.com\\yyy\\docs\\design\\"; 

    var ForReading = 1, ForWriting = 2, ForAppending = 8; 

    Repository.EnsureOutputVisible("Script"); 
    Repository.ClearOutput("Script"); 
    Session.Output("[INFO] Start importing packages from " + filename + ". Please wait..."); 

    var fso = new ActiveXObject("Scripting.FileSystemObject"); 
    f = fso.OpenTextFile(filename, ForReading); 

    // Read from the file and display the results. 
    while (!f.AtEndOfStream) 
    { 
     var r = f.ReadLine(); 
     parseLine(r); 
     Session.Output("--------------------------------------------------------------------------------"); 
    } 

    f.Close(); 
    Session.Output("[INFO] Finished"); 
} 

function parseLine(line) 
{ 
    Session.Output("[INFO] Parsing " + line); 

    var array = new Array(); 
    array = (line).split(";"); 

    var guid; 
    var name; 
    var isVersionControlled; 
    var xmlPath; 
    var parentPath; 

    isVersionControlled = false; 
    xmlPath = ""; 

    for (var z = 0 ; z < array.length; z++) 
    { 
     var pos = array[z].indexOf('='); 

     if (pos > 0) 
     { 
      var key = array[z].substring(0, pos); 
      var value = array[z].substring(pos + 1); 

      if (key=="GUID") { 
       guid = value; 
      } else if (key=="NAME") { 
       name = value; 
      } else if (key=="VCCFG") { 
       if (value != "") { 
        isVersionControlled = true; 
       } 
      } else if (key=="XML") { 
       if (isVersionControlled) { 
        xmlPath = value; 
       } 
      } else if (key=="PARENT") { 
       parentPath = value; 
      } 
     } 
    } 

    // Quick check for target if already exist to speed up process 
    var targetPackage as EA.Package; 
    targetPackage = Repository.GetPackageByGuid(guid); 
    if (targetPackage != null) 
    { 
     // target exists, do not do anything 
     Session.Output("[DEBUG] Target package \"" + name + "\" already exist"); 
     return; 
    } 

    var paths = new Array(); 
    var packages = new Array(paths.Count); 

    for (var i = 0; i < paths.Count; i++) 
    { 
     packages[i] = null; 
    } 

    paths = (parentPath).split("/"); 

    if (paths.Count < 2) 
    { 
     Session.Output("[INFO] Skipped root or level1"); 
     return; 
    } 

    packages[0] = selectRoot(paths[0]); 
    packages[1] = selectPackage(packages[0], paths[1]); 

    if (packages[1] == null) 
    { 
     Session.Output("[ERROR] Cannot find " + paths[0] + "/" + paths[1] + "in Project Browser"); 
     return; 
    } 

    for (var j = 2; j < paths.length; j++) 
    { 
     packages[j] = selectPackage(packages[j - 1], paths[j]); 
     if (packages[j] == null) 
     { 
      Session.Output("[DEBUG] Creating " + packages[j].Name); 

      // create the parent package 
      var parent as EA.Package; 
      parent = Repository.GetPackageByGuid(packages[j-1].PackageGUID); 
      packages[j] = parent.Packages.AddNew(paths[j], ""); 
      packages[j].Update(); 
      parent.Update(); 
      parent.Packages.Refresh(); 
      break; 
     } 
    } 

    // Check if name (package to import) already exist or not 
    var targetPackage = selectPackage(packages[paths.length - 1], name); 

    if (targetPackage == null) 
    { 
     if (xmlPath == "") 
     { 
      Session.Output("[DEBUG] Creating " + name); 

      // The package is not SVN controlled 
      var newPackage as EA.Package; 
      newPackage = packages[paths.length - 1].Packages.AddNew(name,""); 
      Session.Output("New GUID = " + newPackage.PackageGUID); 
      newPackage.Update(); 
      packages[paths.length - 1].Update(); 
      packages[paths.length - 1].Packages.Refresh(); 
     } 
     else 
     { 
      // The package is not SVN controlled 
      Session.Output("[DEBUG] Need to import: " + svnPath + xmlPath); 

      var project as EA.Project; 
      project = Repository.GetProjectInterface; 
      var result; 

      Session.Output("GUID = " + packages[paths.length - 1].PackageGUID); 
      Session.Output("GUID XML = " + project.GUIDtoXML(packages[paths.length - 1].PackageGUID)); 
      Session.Output("XMI file = " + svnPath + xmlPath); 
      result = project.ImportPackageXMI(project.GUIDtoXML(packages[paths.length - 1].PackageGUID), svnPath + xmlPath, 1, 0); 
      Session.Output(result); 

      packages[paths.length - 1].Update(); 
      packages[paths.length - 1].Packages.Refresh(); 
     } 

    } 
    else 
    { 
     // target exists, do not do anything 
     Session.Output("[DEBUG] Target package \"" + name + "\" already exist"); 
    } 
} 

function selectPackage(thePackage, childName) 
{ 
    var childPackage as EA.Package; 
    childPackage = null; 

    if (thePackage == null) 
     return null; 

    for (var i = 0; i < thePackage.Packages.Count; i++) 
    { 
     childPackage = thePackage.Packages.GetAt(i); 

     if (childPackage.Name == childName) 
     { 
      Session.Output("[DEBUG] Found " + childName); 
      return childPackage; 
     } 
    } 

    Session.Output("[DEBUG] Cannot find " + childName); 
    return null; 
} 

function selectRoot(rootName) 
{ 
    for (var y = 0; y < Repository.Models.Count; y++) 
    { 
     root = Repository.Models.GetAt(y); 
     if (root.Name == rootName) 
     { 
      return root; 
     } 
    } 
    return null; 
} 

main(); 
Powiązane problemy