2010-12-02 57 views
0

J'ai voulu copier les fichiers construits sur ma version construits dans un répertoire local, pas sur un partage unc. Donc, je l'ai écrit une activité que je voulais faire:TFS 2010 construit, drop local local non unc share

using System.Activities; 
using System.IO; 
using System.Linq; 
using Microsoft.TeamFoundation.Build.Client; 

namespace CustomBuiltActivities 
{ 
    /// <summary> 
    ///  This activity helps to copy a directory to another one. Integrated in TeamFoundation built activities are only supporting 
    ///  copy to an unc share, so this is a small helper activity we need for copying files to an local directory. 
    /// </summary> 
    [BuildActivity(HostEnvironmentOption.Agent)] 
    public sealed class CopyDirectoryLocal : CodeActivity 
    { 
     [RequiredArgument] 
     public InArgument<string> DestinationDirectory { get; set; } 

     [RequiredArgument] 
     public InArgument<string> SourceDirectory { get; set; } 

     protected override void Execute(CodeActivityContext context) 
     { 
      var destination = context.GetValue(DestinationDirectory); 
      var source = context.GetValue(SourceDirectory); 
      CopyRecursive(source, destination); 
     } 

     private static void CopyRecursive(string sourceDirectory, string destinationDirectory) 
     { 
      if (!Directory.Exists(sourceDirectory)) 
       throw new DirectoryNotFoundException(sourceDirectory); 
      try 
      { 
       Directory.CreateDirectory(destinationDirectory); 
      } 
      catch 
      { 
      } 
      Directory.GetDirectories(sourceDirectory).ToList().ForEach(
       sourceDir => 
        { 
         var dirName = sourceDir.Substring(sourceDir.LastIndexOf("\\")); 
         CopyRecursive(sourceDir, destinationDirectory+"\\"+dirName); 
        }); 
      Directory.GetFiles(sourceDirectory).ToList().ForEach(
       sourceFile => 
        { 
         var fileName = new FileInfo(sourceFile).Name; 
         File.Copy(sourceFile, string.Concat(destinationDirectory, "\\", fileName)); 
        } 
       ); 
     } 
    } 
} 

Mais cette activité tombe en panne et laissez-moi savoir que le répertoire n'a pas été trouvé. Comment le réparer? J'ai besoin de personnalisation en récupérant manuellement les dossiers séparés des binaires.

Thx pour l'aide, Michael Baarz

Répondre

2

Pourquoi ne pas utiliser un chemin unc basé sur localhost?

\ localhost \ MyDir

ou même

\ localhost \ c $ \ mydir

Si vous souhaitez poursuivre votre activité personnalisée, il est assez facile à déboguer. Exécutez le code dans un test unitaire (ou avec, par exemple, une application de console) avec les valeurs spécifiées. Êtes-vous sûr que le répertoire source existe lorsque vous démarrez cette activité? Vous pouvez ajouter des contrôles supplémentaires (tels que Directory.Exists) dans votre code. Vous pouvez également déboguer votre code avec http://www.ewaldhofman.nl/post/2010/10/01/Customize-Team-Build-2010-e28093-Part-12-How-to-debug-my-custom-activities.aspx

+0

Si vous utilisez \ localhost \, les utilisateurs qui cliquent sur "Open Drop Folder" après la fin de la construction ne peuvent pas l'ouvrir. Il essaie de naviguer vers leur machine locale, pas le serveur de construction. Malheureusement, je ne sais pas comment résoudre cela. – Pierre