Donnerstag, 7. November 2013

WinApi::CreateDirectoryPath verursacht Fehler bei Verwendung von UNC Pfaden

Bei der Umstellung der Version Kontrolle von relativen Pfaden hin zu UNC Pfaden musste ich feststellen das die Methode WINAPI::CreateDirectoryPath nicht mit UNC Pfaden arbeiten kann. Es wird  folgender Fehlermeldung ausgegeben:

"ClrObject static method invocation error"

Es hat eine Weile gedauert aber dann bin ich auf eine funktionierende Lösung gestoßen.

// Verifyes or creates Path
static client public boolean createDirectoryPath(FilePath _path)
{
         int ptr;
         ;

         _path = strLRTrim(_path);

         if (substr(_path,strlen(_path),1) != '\\') // Adding backslash gives a more simple while-loop!
         {
                 _path += '\\';
         }

         //enables creation of UNC paths, by detecting which folder already exists (backwards).
         ptr = strLen(_path);
         ptr = strfind(_path, '\\', ptr, -ptr);
         while(!WinAPI::folderExists(substr(_path,1,ptr)))
         {
                  ptr = strfind(_path, '\\', ptr -1 , -ptr);
         }

         while (ptr)
         {
                 WinAPI::createDirectory(substr(_path, 1, ptr));

                 if (!WinAPI::folderExists(substr(_path, 1, ptr)))
                {
                        break;
                }

                ptr = strfind(_path, '\\', ptr + 1, strlen(_path));
         }

         return WinAPI::folderExists(_path);
}

Verwendung von Team Foundation Server 2012 als Versionskontrolle für AX 2009

Grundsätzlich kann man für die Installation und Integration die Step by Step Anleitung aus folgenden Blog verwenden http://blog.enhancealm.com.au/2011/03/08/dynamics-ax-development-using-tfs-2010/. Das Vorgehen für TFS2010 ist auf TFS2012 übertragbar.

Problematischer stellte sich die Integration in unserer Multi Developer Umgebung da. Wir verwenden für die Entwicklung von AX2009, Citrix Clients. Über die der jeweilige Entwickler auf den AOS zugreift. AX2009 kennt standardmäßig nur einen Speicherort für das lokale Repository. Um für jeden Entwickler ein lokales Repository zu verwenden musste die AX Klasse SysVersionControlParameters angepasst werden, um eine eigenes Repository mit der Benutzerkennung zu erstellen.

    #SysVersionControl
    SysVersionControlParameters parameter;
    ;
    parameter.selectForUpdate(_forupdate);
    select firstonly parameter
        index Key
        where parameter.Key == 0;

    if(parameter)
    {
        if(parameter.VCSType == SysVersionControlType::SysVersionControlTfs)
        {
            parameter.RepositoryFolder = strFmt("%1_%2",parameter.RepositoryFolder,curUserId());
            new InteropPermission( InteropKind::ClrInterop ).assert();
            if(!WinApi::pathExists(parameter.RepositoryFolder))
            {
               WinApi::createDirectoryPath(parameter.RepositoryFolder);
                info('Nur für Entwickler:\r\nBitte Repository manuell synchronisieren');
            }
        }
    }
.
.
.

Bei der Angabe des Repository für die AX Versions Kontrolle Parameters wird nun nur der Pfad zum Basisordner für alle Entwickler Repository angegeben werden.