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>
Run Code Online (Sandbox Code Playgroud)
这是对此解决方案的一次返工尝试,因为我试图将此模板隔离到外部文件。该模板包含 MSBuild 属性引用,例如$(ApplicationName). 当完全按照链接解决方案中的描述执行此操作时,它工作得很好,但是当将模板作为字符串加载时,这些属性表达式在到达文件时都不会被评估。
<SPAN CLASS="BannerTextApplication">$(ApplicationName)</SPAN>
Run Code Online (Sandbox Code Playgroud)
是否有一个 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>
Run Code Online (Sandbox Code Playgroud)
这是您的模板。它不是纯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>
Run Code Online (Sandbox Code Playgroud)
也许它不是很优雅(我个人不喜欢@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>
Run Code Online (Sandbox Code Playgroud)
您也可以在此处下载这些文件
| 归档时间: |
|
| 查看次数: |
2966 次 |
| 最近记录: |