6

私たちのチームはリポジトリにEnterprise Architect version 10とを使用しています。ファイル サイズが非常に大きいSVNため(例: 80 MB)、各パッケージを個別にエクスポートし、. ファイル自体は、マイルストーンの後にコミットされます。問題は、開発中にファイルを同僚からの作業と同期させることです。大量のファイルをインポートする必要があります(たとえば、合計で 500 ファイルになる可能性があります)。EAPXMISVNEAPEAPXMI

ファイルが更新されたら、EAPPackage Control -> Get All Latest を使用できることはわかっています。したがって、この問題は並行開発中にのみ発生します。

次のように、キーボード ショートカットを使用してインポートを行いました。

  1. Ctrl+ Alt+ (ファイルIからパッケージをインポート)XMI
  2. インポートするファイル名を選択
  3. Alt+ I(インポート)
  4. Enter(はい)
  5. モジュールが終了するまで、ステップ番号 2 から 4 を繰り返します

それでも、何百ものファイルをインポートするのは非効率的です。

コントロール パッケージにバッチ インポート/エクスポートがあることを確認しました。を明示的にハードコードした場合、バッチ インポート/エクスポートは機能XMI Filenameしますが、バージョン管理を使用している場合、オプションは使用できません (バッチ インポート/エクスポート オプションはグレー表示されます)。

ファイルを同期するためのより良い方法はありEAPますXMIか?

4

2 に答える 2

4

EA にはスクリプトインターフェイスがあります。それを使用してインポートを自動化できる場合があります。私はそれを使用していませんが、おそらくかなり良いでしょう。

私はあなたの作業環境を完全に理解しているとは言えませんが、興味深い点がいくつかあります。EA を別の方法で使用すると (特に、以下の最初のポイント)、バッチ インポートの必要性がなくなる可能性があります。

マルチワーカー

まず、一度に複数の人が同じ EAP ファイルで作業できます。EAP ファイルは Access データベース ファイルに過ぎず、EA はロックを使用して、複数のユーザーが同じパッケージを同時に編集するのを防ぎます。しかし、複数の人が 1 つの EAP ファイル内の異なるパッケージを同時に編集することは問題なくできます。EAP ファイルをどこかのファイル共有に置くことは、それを行う良い方法です。

組み込みのリビジョン管理

次に、EA は SVN (およびその他のリビジョン管理システム) と直接対話できます。これを参照してください。つまり、個々のパッケージ (およびその下のすべて) が SVN で制御されるように EAP ファイルをセットアップできます。次に、個々のパッケージをチェックアウトし、編集して、再度チェックインできます。または、実際には、パッケージの下のブランチ全体をチェックアウトできます (それ自体が SVN で制御されているサブパッケージを含む)。

内部では、EA は XMI ファイルをインポートおよびエクスポートし、SVN にチェックインおよびチェックアウトしますが、EAP ファイルは常にヘッド リビジョンです。手作業と同じですが、自動化されています。単一の EAP ファイルをすべて使用できることを考えると、これは理にかなっています。ロールバックには少し注意が必要です。1 つのパッケージの古いバージョンのオブジェクトからのリンクが、存在しないオブジェクトを指している可能性があります (ただし、インポート ログ エラーを見て、これが事実であるかどうかを確認できます)。慣れるまで少し時間がかかりますが、かなりうまく機能します。

また、組み込みのパッケージ ベースライン機能もあります。いずれにせよ必要なのはそれだけであり、特に全員が同じ EAP ファイルを使用している場合は非常にうまく機能します。

より大きなデータベース エンジン

第 3 に、EAP ファイルを用意する必要はまったくありません。モデルのデータベースは、任意の適切なデータベース システム (MySQL、SQL Server、Oracle など) にすることができます。そのため、使用方法、WAN/インターネット経由での使用方法などをスケールアップするためのあらゆる種類のオプションが提供されます。

要するに、Sparx はマルチワーカー環境で EA を使用する方法と、それを活用する価値について非常に賢明でした。

于 2013-06-01T06:58:31.703 に答える
1

自動化のために JScript を使用して EA スクリプトを作成しました

エクスポートを行うスクリプトは次のとおりです。

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

そして、インポートを行うスクリプト:

!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();
于 2013-08-01T07:53:20.543 に答える