Buenas,
hoy toca publicar una actividad, que en sí es bastante simple, pero que nos ahorra infinidad de problemas cuando no la tenemos a mano: Directory.Copy(). Tal cual, más simple no puede ser y su propio nombre ya te da a entender lo que esperamos de la misma.
La clase que la implementa es muy simple, se basa en el siguiente código, donde lo importante son las propiedades
- Source, define el directorio de origen a copiar
- Target, define la ubicación del directorio de destino
- DisplayInformation, que define si queremos mostrar información de los archivos copiados en el log de la Build
1: using System.Activities;
2: sing System.IO;
3: sing Microsoft.TeamFoundation.Build.Client;
4: sing Microsoft.TeamFoundation.Build.Workflow.Activities;
5:
6: amespace ElBruno.TeamBuild.Activities
7:
8: [BuildActivity(HostEnvironmentOption.All)]
9: public class CopyDirectory : CodeActivity
10: {
11: [RequiredArgument]
12: public InArgument<string> Source { get; set; }
13:
14: [RequiredArgument]
15: public InArgument<string> Target { get; set; }
16:
17: [RequiredArgument]
18: public InArgument<bool> DisplayActionInformation { get; set; }
19:
20: protected override void Execute(CodeActivityContext context)
21: {
22: // get activity property values
23: var source = context.GetValue(Source);
24: var target = context.GetValue(Target);
25: var displayActionInformation = context.GetValue(DisplayActionInformation);
26: // copy
27: CopyFolder(context, source, target, displayActionInformation);
28: }
29:
30: static public void CopyFolder(CodeActivityContext context, string sourceFolder, string destFolder, bool displayActionInformation)
31: {
32: if (!Directory.Exists(destFolder))
33: Directory.CreateDirectory(destFolder);
34: var files = Directory.GetFiles(sourceFolder);
35: foreach (var file in files)
36: CopyFile(destFolder, file, displayActionInformation, context);
37: var folders = Directory.GetDirectories(sourceFolder);
38: foreach (var folder in folders)
39: CopyFolder(destFolder, displayActionInformation, context, folder);
40: }
41:
42: private static void CopyFolder(string destFolder, bool displayActionInformation, CodeActivityContext context, string folder)
43: {
44: var name = Path.GetFileName(folder);
45: if (name == null) return;
46: var dest = Path.Combine(destFolder, name);
47: var msg = string.Format(@"Copy Folder from [{0}] to [{1}]", name, dest);
48: context.TrackBuildMessage(msg, BuildMessageImportance.Normal);
49: CopyFolder(context, folder, dest, displayActionInformation);
50: }
51:
52: private static void CopyFile(string destFolder, string file, bool displayActionInformation, CodeActivityContext context)
53: {
54: var name = Path.GetFileName(file);
55: if (name == null) return;
56: var dest = Path.Combine(destFolder, name);
57: File.Copy(file, dest);
58: if (!displayActionInformation) return;
59: var msg = string.Format(@"Copy file from [{0}] to [{1}]", name, dest);
60: context.TrackBuildMessage(msg, BuildMessageImportance.Normal);
61: }
62: }
Una vez definida y compilada la actividad, agregamos la misma a la definición de la build, por ejemplo después de la ejecución de los tests unitarios, indicando como destino el directorio C:\Temp
Cuando ejecutamos la build, ya podremos ver en la misma, el log de archivos copiados a este directorio.
Para la próxima un poco sobre Intellisense y Team Build 2010.
Saludos @ Home
El Bruno


Leave a reply to [Spanish] Visual Studio 2010 ALM y Team Foundation Server 2010, 2008 y 2005 | El Bruno Cancel reply