Jon*_*vis 6 msbuild msbuild-task msbuild-4.0
我有一个自定义的 MSBuild 目标,部分代码片段如下..
<Target Name="PublishHtm">
  <PropertyGroup>
    <PublishHtmTemplateContents>$([System.IO.File]::ReadAllText($(PublishHtmTemplatePath)))</PublishHtmTemplateContents>
    <PublishHtm>$(PublishHtmTemplateContents)</PublishHtm>
  </PropertyGroup>
  <WriteLinesToFile Lines="$(PublishHtm)" File="$(PublishDir)\publish.htm" Overwrite="true"/>
</Target>
这是对此解决方案的一次返工尝试,因为我试图将此模板隔离到外部文件。该模板包含 MSBuild 属性引用,例如$(ApplicationName). 当完全按照链接解决方案中的描述执行此操作时,它工作得很好,但是当将模板作为字符串加载时,这些属性表达式在到达文件时都不会被评估。
<SPAN CLASS="BannerTextApplication">$(ApplicationName)</SPAN>
是否有一个 MSBuild 表达式/函数可以用来在给定调用目标的上下文的情况下重新评估字符串?
顺便说一句,我不想使用查找/替换或正则表达式替换来解决问题,而是坚持使用 MSBuild 表达式引擎。
使用 Visual Studio 2012 和 .NET Framework 4.5。
抱歉暂时没有回到这个问题。最初我认为要解决这个问题,我们需要以非常不寻常的方式弯曲 MSBuild(今天的计划是编写复杂的内联任务,它将使用 Msbuild 属性作为标记在外部文件中进行正则表达式替换)。但我认为使用 CDATA 部分可以更轻松地解决这个问题,该部分在属性定义中有效:
这是主要脚本:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
    <PropertyGroup>
        <MyOtherProperty>$([System.DateTime]::Now)</MyOtherProperty>
        <Version>1.0.1b</Version>
        <ProjectName>MSBuild Rox</ProjectName>
        <Author>Alexey Shcherbak</Author>
    </PropertyGroup>
    <Target Name="Build">
        <ItemGroup>
            <PropsToPass Include="MyOtherProperty=$(MyOtherProperty)" />
            <PropsToPass Include="Version=$(Version)" />
            <PropsToPass Include="ProjectName=$(ProjectName)" />
            <PropsToPass Include="Author=$(Author)" />
        </ItemGroup>
        <MSBuild Projects="TransformHTML.Template.proj" Properties="@(PropsToPass)" />
    </Target>
</Project>  
这是您的模板。它不是纯html,它仍然是msbuild文件,但至少没有对xml中的html标签进行丑陋的编码。它只是 CDATA 中的一个块
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Transform">
    <PropertyGroup>
            <HtmlProperty><![CDATA[
                <body>
                    <div>$(MyOtherProperty)</div>
                    <div>$(Version)</div>
                    <div>$(ProjectName)</div>
                    <div>$(Author)</div>
                </body>
            ]]></HtmlProperty>
        </PropertyGroup>
    <Target Name="Transform">
        <Message Text="HtmlProperty: $(HtmlProperty)" Importance="High" />
    </Target>
</Project>  
也许它不是很优雅(我个人不喜欢@PropsToPass 的部分),但它可以完成工作。您可以将所有内容内联放入单个文件中,然后无需将属性传递给 MSBuild 任务。我不喜欢建议的“此解决方案”中的大量 html 编码,但我宁愿将 HTML 模板保留在将要转换的同一脚本中,只是采用良好的 html 格式,而不进行编码。
单个文件示例:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
    <PropertyGroup>
        <MyOtherProperty>$([System.DateTime]::Now)</MyOtherProperty>
        <Version>1.0.1b</Version>
        <ProjectName>MSBuild Rox</ProjectName>
        <Author>Alexey Shcherbak</Author>
    </PropertyGroup>
    <Target Name="Build">
        <PropertyGroup>
            <HtmlProperty><![CDATA[
                <body>
                    <div>$(MyOtherProperty)</div>
                    <div>$(Version)</div>
                    <div>$(ProjectName)</div>
                    <div>$(Author)</div>
                </body>
            ]]></HtmlProperty>
        </PropertyGroup>
        <Message Text="HtmlProperty: $(HtmlProperty)" Importance="High" />
    </Target>
</Project>  
您也可以在此处下载这些文件
| 归档时间: | 
 | 
| 查看次数: | 2966 次 | 
| 最近记录: |