2013-05-24 25 views
6

Nhóm của chúng tôi đang sử dụng Enterprise Architect version 10SVN cho kho lưu trữ. Do kích thước tệp EAP là khá lớn (ví dụ: 80 MB), chúng tôi xuất mỗi gói thành riêng biệt XMI và lưu trữ nó thành SVN. Bản thân số EAP được cam kết sau một số mốc quan trọng. Vấn đề là để đồng bộ hóa tệp EAP với công việc của đồng nghiệp trong quá trình phát triển, chúng tôi cần nhập rất nhiều XMI (ví dụ: tổng số có thể là 500 tệp).Cách hiệu quả để thực hiện nhập XMI hàng loạt trong Kiến trúc sư doanh nghiệp

Tôi biết rằng khi tệp EAP được cập nhật, chúng tôi có thể sử dụng Kiểm soát gói -> Nhận tất cả mới nhất. Do đó vấn đề này chỉ xảy ra trong quá trình phát triển song song.

Chúng tôi đã sử dụng shorcuts bàn phím để làm việc nhập khẩu như sau:

  1. Ctrl + Alt + tôi (Import gói từ XMI tập tin)
  2. Chọn tên tập tin cần nhập
  3. Alt + I (Nhập)
  4. Nhập (Yes)
  5. Lặp lại bước số 2-4 cho đến khi mô-đun xong

Nhưng vẫn còn, nhập khẩu hàng trăm tập tin là không hiệu quả.

Tôi đã kiểm tra Gói điều khiển có Nhập/Xuất hàng loạt. Xuất/nhập lô đang hoạt động khi tôi mã hóa rõ ràng XMI Filename, nhưng các tùy chọn không khả dụng nếu sử dụng điều khiển phiên bản (tùy chọn nhập/xuất hàng loạt có màu xám).

Có cách nào tốt hơn để đồng bộ hóa các tệp EAPXMI không?

Trả lời

4

Có giao diện scripting trong EA. Bạn có thể tự động nhập bằng cách sử dụng. Tôi đã không sử dụng nó nhưng nó có thể khá tốt.

Tôi không chắc rằng tôi hoàn toàn hiểu môi trường làm việc của bạn, nhưng tôi có một số điểm chung có thể được quan tâm. Nó có thể là nếu bạn sử dụng EA theo một cách khác (đặc biệt là điểm đầu tiên của tôi dưới đây), nhu cầu nhập hàng loạt có thể biến mất.

Multiworker

Thứ nhất, nhiều người có thể làm việc trên các tập tin EAP cùng một lúc. Tệp EAP không có gì khác ngoài tệp cơ sở dữ liệu Access và EA sử dụng khóa để ngăn nhiều người chỉnh sửa cùng một gói cùng một lúc. Nhưng bạn có thể thoải mái có nhiều người chỉnh sửa các gói khác nhau trong cùng một tệp EAP cùng một lúc. Đặt tệp EAP trên một tệp chia sẻ ở đâu đó là một cách hay để thực hiện nó.

Găn Revision kiểm soát

Thứ hai, EA có thể tương tác trực tiếp với SVN (và các hệ thống kiểm soát phiên bản khác). Xem this.Tóm lại, bạn có thể thiết lập tệp EAP của bạn để các gói riêng lẻ (và mọi thứ bên dưới chúng) được điều khiển SVN. Sau đó bạn có thể kiểm tra một gói riêng lẻ, chỉnh sửa nó, kiểm tra lại. Hoặc thực sự bạn có thể kiểm tra toàn bộ nhánh bên dưới một gói (bao gồm cả các gói con mà chính SVN kiểm soát).

Bên dưới bảng điều khiển EA đang nhập và xuất các tệp XMI và kiểm tra chúng trong và ngoài SVN, trong khi tệp EAP luôn là bản sửa đổi đầu. Cũng giống như những gì bạn đang làm bằng tay, nhưng tự động. Có nghĩa là bạn có thể sử dụng một tệp EAP duy nhất. Bạn phải cẩn thận một chút - các liên kết có nguồn gốc từ các đối tượng trong các phiên bản cũ của một gói có thể trỏ vào các đối tượng không còn tồn tại (nhưng bạn có thể xem các lỗi nhật ký nhập để xem trường hợp này). Phải mất một chút làm quen với, nhưng nó hoạt động khá tốt.

Ngoài ra còn có chức năng baselining gói được tích hợp sẵn - có thể là tất cả những gì bạn cần, và hoạt động khá tốt, đặc biệt nếu bạn đang sử dụng cùng một tệp EAP.

Bigger Database Engine

Thứ ba, bạn không cần phải có một tập tin EAP ở tất cả. Cơ sở dữ liệu của mô hình có thể nằm trong bất kỳ hệ thống cơ sở dữ liệu thích hợp nào (MySQL, SQL Server, Oracle, v.v.). Vì vậy, cung cấp cho bạn tất cả các loại tùy chọn để mở rộng quy mô sử dụng của nó, giống như trên mạng WAN/Internet, v.v.

Trong ngắn Sparx khá hợp lý về cách EA có thể được sử dụng trong môi trường nhiều người lao động, và giá trị của nó khai thác điều đó.

+0

Okay , hãy để tôi kiểm tra kịch bản và Kiểm soát sửa đổi sẵn có – David

+0

Điều khiển sửa đổi sẵn có tương tự như những gì chúng tôi đang thực hiện ngay bây giờ. Không có vấn đề gì để kiểm tra gói SVN và để xuất XMI. Vấn đề là trong lần nhập đầu tiên của XMI vì mỗi thành viên trong nhóm sử dụng tệp EAP của riêng mình. Đối với kịch bản, tôi chỉ thấy một vài ví dụ và giải thích: ( – David

+0

Tệp EAP của mỗi thành viên trong nhóm có giống hệt nhau không? Nếu có, bạn chỉ cần chọn một tệp hoàn toàn cập nhật (hoặc tạo một cái), hãy gắn nó vào một tệp chia sẻ, và sau đó tất cả mọi người có thể từ bỏ riêng của họ và bắt đầu sử dụng một trong đó.Bạn có thể sau đó thiết lập rằng tập tin EAP duy nhất để tích hợp chính nó với SVN.Bạn sẽ mất liên tục trong lịch sử sửa đổi của bạn. tệp EAP duy nhất và sau đó sử dụng tích hợp SVN tự động sẵn có của EA từ bây giờ – bazza

1

Tôi đã tạo ra kịch bản EA sử dụng JScript cho tự động hóa

Dưới đây là kịch bản để làm việc xuất khẩu:

!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(); 

Và kịch bản để làm việc nhập khẩu:

!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(); 
Các vấn đề liên quan