2009-03-19 6 views
0

J'ai les lignes suivantes dans mon fichier de projet MSBuild:Comment remplacer l'extension d'un chemin de fichier stocké dans une propriété MSBuild?

<PropertyGroup> 
    <TestResultsFileName Condition=" '$(TestResultsFileName)' == '' "> 
     TestResults.trx 
    </TestResultsFileName> 
    <TestResultsFilePath>$(OutDir)\$(TestResultsFileName)</TestResultsFilePath> 
</PropertyGroup> 

Je dois créer un autre fichier, ayant le même nom que TestResultsFilePath uniquement avec l'extension .xml. Donc je veux avoir une propriété pour contenir le chemin du fichier de l'autre fichier.

Au début, je pensais que quelque chose comme ça fonctionnerait:

<PropertyGroup> 
    <NUnitResultsFilePath> 
     $(OutDir)\$(TestResultsFileName->'%(Filename).xml') 
    </NUnitResultsFilePath> 
</PropertyGroup> 

Et, bien sûr, il n'a pas, parce que TestResultsFileName n'est pas une collection d'éléments. Malheureusement, cela ne peut pas être le cas, car c'est un paramètre pour une tâche qui attend une valeur simple, pas une collection. Donc, ma question est comment puis-je remplacer l'extension de la valeur de la propriété TestResultsFileName par .xml?

Merci.

Répondre

0

Peu importe. J'ai écrit une tâche personnalisée pour faire le travail:

public class ReplaceExtension : Task 
    { 
     [Required] 
     public string FilePath { get; set; } 

     public string NewExtension { get; set; } 

     [Output] 
     public string Result { get; set; } 

     public override bool Execute() 
     { 
      if (string.IsNullOrEmpty(FilePath)) 
      { 
       Log.LogError("FilePath cannot be empty!"); 
       return false; 
      } 

      try 
      { 
       int length = FilePath.Length; 
       int startIndex = length; 
       int oldExtensionLength = 0; 
       while (--startIndex >= 0) 
       { 
        char ch = FilePath[startIndex]; 
        if (ch == '.') 
        { 
         oldExtensionLength = length - startIndex; 
         break; 
        } 
        if (ch == Path.DirectorySeparatorChar || 
         ch == Path.AltDirectorySeparatorChar || 
         ch == Path.VolumeSeparatorChar) 
        { 
         break; 
        } 
       } 

       bool isNewExtensionEmpty = string.IsNullOrEmpty(NewExtension) || 
        (NewExtension.Length == 1 && NewExtension[0] == '.'); 

       if (isNewExtensionEmpty) 
       { 
        // The new extension is empty - remove the old extension. 
        if (oldExtensionLength > 0) 
        { 
         Result = FilePath.Remove(startIndex, oldExtensionLength); 
        } 
        else 
        { 
         Result = FilePath; 
        } 
       } 
       else 
       { 
        // Replace the old extension with the new one. 
        StringBuilder sb = new StringBuilder(FilePath.Length - oldExtensionLength + 
         NewExtension.Length + (NewExtension[0] == '.' ? 0 : 1)); 
        sb.Append(FilePath, 0, FilePath.Length - oldExtensionLength); 
        if (NewExtension[0] != '.') 
        { 
         sb.Append('.'); 
        } 
        sb.Append(NewExtension); 
        Result = sb.ToString(); 
       } 
      } 
      catch (Exception ex) 
      { 
       Log.LogErrorFromException(ex); 
      } 
      return !Log.HasLoggedErrors; 
     } 
    } 

Je l'utilise comme ceci:

<Target Name="CreateProperties"> 
    <ReplaceExtension FilePath="$(TestResultsFilePath)" NewExtension="xml"> 
     <Output TaskParameter="Result" PropertyName="NUnitResultsFilePath"/> 
    </ReplaceExtension> 
    </Target> 
Questions connexes