2009-11-10 5 views
3

В частности, я ищу нулевую площадку для создания строковой метки. т. е. построить 7 в сборку 007. Вы можете легко добавить строки вместе, но во всех моих поисках по форматированию, заполнению, строкам и т. д. ... Мне не удалось найти ссылок.Как вы форматируете текст в MSBuild?

Пример того, с чем я работаю.

<PropertyGroup> 
    <FileParserVersion>File Parser $(Major).$(Minor).$(Build) Build $(Revision)</FileParserVersion> 
    <VersionComment>Automated build: $(FileParserVersion)</VersionComment> 
</PropertyGroup> 

This is generated: FILEPARSER_1_0_3_BUILD_7
What is preferred: FILEPARSER_1_0_3_BUILD_007

ответ

3

Рассмотрим следующий ITask:

using Microsoft.Build.Framework; 
using Microsoft.Build.Utilities; 

namespace My.MSBuild.Tasks 
{ 
    public class FormatRevision : Task 
    { 
     #region Public Properties 

     [Required] 
     public int Revision { get; set; } 

     [Required] 
     public string MajorVersion { get; set; } 

     [Output] 
     public string OutputVersion { get; private set; } 

     #endregion 

     #region ITask Methods 

     public override bool Execute() 
     { 
      OutputVersion = string.Format("{0}.{1}" 
       , MajorVersion 
       , Revision < 10 ? 
        "00" + Revision : Revision < 100 ? 
         "0" + Revision : Revision.ToString()); 

      Log.LogMessage("Revision: {0} -> Output Version: {1}" 
       , Revision, OutputVersion); 

      return true; 
     } 

     #endregion 
    } 
} 

MSBuild мишень (formatvesion.proj):

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

<Target Name="FormatRevision"> 
    <FormatRevision MajorVersion="$(MajorVersion)" Revision="$(Revision)"> 
     <Output TaskParameter="OutputVersion" PropertyName="FormattedVersion"/> 
    </FormatRevision> 
    </Target> 

<UsingTask TaskName="My.MSBuild.Tasks.FormatRevision" AssemblyFile="My.MSBuild.Tasks.dll" /> 

</Project> 

Вызывается командой:

msbuild formatvesion.proj /t:FormatRevision /p:MajorVersion=1.0;Revision=7 

В качестве альтернативы, если вы хотите использовать CreateProperty:

<PropertyGroup> 
    <FileParserVersion>File Parser $(Major).$(Minor).$(Build) Build $(Revision)</FileParserVersion> 
    <VersionComment>Automated build: $(FileParserVersion)</VersionComment> 
</PropertyGroup> 

<PropertyGroup> 
    <PaddedRevision Condition="$(Revision) &lt; 1000">$(Revision)</PaddedRevision> 
    <PaddedRevision Condition="$(Revision) &lt; 100">0$(Revision)</PaddedRevision> 
    <PaddedRevision Condition="$(Revision) &lt; 10">00$(Revision)</PaddedRevision> 
</PropertyGroup> 

<Target Name="test"> 

    <CreateProperty 
     Value="FILEPARSER_$(Major)_$(Minor)_$(Build)_BUILD_$(PaddedRevision)"> 
     <Output TaskParameter="Value" PropertyName="MyFileVersion" /> 
    </CreateProperty> 
    <Message Text="$(VersionComment) -> $(MyFileVersion)" /> 

</Target> 
+0

Я не хочу менять версию, я пытаюсь создать текстовую строку, которая будет использоваться как метка в исходном элементе управления и как имя папки для развертывания в QA. – Shire

+0

Задача CreateProperty должна быть выполнена: http://msdn.microsoft.com/en-us/library/63ckb9s9.aspx Если это не так, отправьте некоторые фрагменты проекта, который вы пытаетесь отлаживать. – KMoraz

+0

Я добавил фрагмент оригинала с фактическим и желаемым выходом. – Shire

6

В 4.0+ вы можете сделать это в одной строке с Property Functionson MSDN)

$([System.String]::Format('FILEPARSER_$(Major)_$(Minor)_$(Build)_BUILD_{0:000}', $([MSBuild]::Add($(Revision), 0)))) 

К сожалению фиктивная " Add "необходимо, чтобы обмануть MSBuild, чтобы принудить $ (Revision) к числу до того, как он принудительно введет его в объект, ожидаемый String.Format. Если я не делаю этого, он использует строку, а заполнение не работает. Принуждение внутри MSBuild может быть немного умнее здесь.

+1

Использование $ ([System.Int32] :: Parse ($ (Revision)) также работает –