Как вы форматируете текст в MSBuild? - PullRequest
3 голосов
/ 10 ноября 2009

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

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

<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

Ответы [ 2 ]

6 голосов
/ 18 июля 2011

В 4.0+ вы можете сделать это в одной строке с Функции свойств в MSDN )

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

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

4 голосов
/ 10 ноября 2009

Рассмотрим следующую 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>
...