Как заменить расширение пути к файлу, хранящегося в свойстве MSBuild? - PullRequest
0 голосов
/ 19 марта 2009

В моем файле проекта MSBuild есть следующие строки:

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

Мне нужно создать другой файл с тем же именем, что и TestResultsFilePath, только с расширением .xml. Поэтому я хочу иметь свойство для хранения пути к файлу другого файла.

Сначала я думал, что что-то вроде этого будет работать:

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

И, конечно, это не так, потому что TestResultsFileName не является коллекцией элементов. К сожалению, это не может быть так, потому что это параметр для некоторой задачи, которая ожидает простое значение, а не коллекцию.

Итак, мой вопрос: как я могу заменить расширение значения свойства TestResultsFileName на .xml?

Спасибо.

1 Ответ

0 голосов
/ 24 марта 2009

Неважно. Я написал пользовательское задание для выполнения этой работы:

    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;
        }
    }

Я использую это так:

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