【问题标题】:How do you format text in MSBuild?如何在 MSBuild 中格式化文本?
【发布时间】:2009-11-10 14:43:00
【问题描述】:

具体来说,我正在寻找零填充数字以创建基于字符串的标签。即构建 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

【问题讨论】:

    标签: msbuild msbuild-task


    【解决方案1】:

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

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

    不幸的是,在将 $(Revision) 强制转换为 String.Format 预期的对象之前,必须使用虚假的“添加”来欺骗 MSBuild 将其强制转换为一个数字。如果我不这样做,它会使用一个字符串,并且填充不起作用。 MSBuild 内部的强制在这里可能更聪明一些。

    【讨论】:

    • 使用 $([System.Int32]::Parse($(Revision)) 也可以
    【解决方案2】:

    考虑以下 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>
    

    【讨论】:

    • 我不想更改版本,我正在尝试创建一个文本字符串,该字符串将用作源代码管理中的标签和部署到 QA 的文件夹名称。
    • CreateProperty 任务应该执行:msdn.microsoft.com/en-us/library/63ckb9s9.aspx 如果没有,请发布您正在尝试调试的项目的一些 sn-ps。
    • 我在原版中添加了一个 sn-p,其中包含实际输出与所需输出。
    • 见我上面更新的例子。给定您的 sn-p 中的属性,它会产生所需的输出。
    • 完美!我什至没有想到要尝试一些聪明的数学!
    猜你喜欢
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多