代码之家  ›  专栏  ›  技术社区  ›  Shire

如何在msbuild中设置文本格式?

  •  3
  • Shire  · 技术社区  · 16 年前

    具体地说,我希望零填充一个数字来创建一个基于字符串的标签。即构建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 回复  |  直到 15 年前
        1
  •  4
  •   KMoraz    16 年前

    考虑以下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>
    
        2
  •  6
  •   cheerless bog    15 年前

    在4.0+中,您可以使用 Property Functions (和 on MSDN )

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

    不幸的是,虚伪的“add”在强制msbuild将$(revision)强制为string.format所需的对象之前,必须欺骗msbuild将其强制为数字。如果我不这样做,它使用了一个字符串,填充不起作用。在这里,msbuild内部的强制可能更智能一些。