【发布时间】:2015-04-15 00:06:20
【问题描述】:
我有一个自定义的 MSBuild 目标,部分 sn-p 如下..
<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>
这是this solution 的返工尝试,因为我试图将此模板隔离到外部文件。该模板包含 MSBuild 属性引用,例如 $(ApplicationName)。当完全按照linked solution 中的描述执行此操作时,它可以正常工作,但是当将模板作为字符串加载时,在它到达文件时不会评估这些属性表达式。
<SPAN CLASS="BannerTextApplication">$(ApplicationName)</SPAN>
是否有一个 MSBuild 表达式/函数可用于在调用 Target 的上下文中重新评估字符串?
顺便说一句,我宁愿不使用查找/替换或正则表达式替换来解决问题,并坚持使用 MSBuild 表达式引擎。
使用 Visual Studio 2012 和 .NET Framework 4.5。
【问题讨论】:
-
您应该将属性/项目声明放在目标中。在msdn.microsoft.com/en-us/magazine/dd419659.aspx 上查看动态属性和项目。
-
您正在从外部文件加载此模板。这意味着 msbuild 引擎不会在模板本身中进行任何属性扩展。因此,您的 $(PublishHtmTemplateContents) 只是从文件中读取的文本字符串。您只需将其重新分配给 $(PublishHtm) 作为文本值。引擎无法以这种方式工作。您可以尝试将模板以某种形式的目标包装在单独的文件中,然后使用 msbuild 任务构建它。
-
@SayedIbrahimHashimi,查看我的问题,我正在从目标节点中读取我的属性声明,而您的文章让我患有 TL;DR,因为 MSBuild 中有 TMI。你在说什么?你能总结一下吗?
-
@AlexeyShcherbak 我很清楚 MSBuild 并不完全以这种方式工作,这就是我发布问题的原因。 (实际上,它确实工作,除了需要重新评估的延迟加载的表达式。)您能否详细说明您的“您可以尝试..”措辞作为建议的答案?
-
仅供参考,如果您在我的问题中点击“此解决方案”一词的超链接,您可以看到我开始的内容,而且我已经知道该方法确实有效,正如我明确表示的在我的问题文本中。我正在尝试建立一种不同的方式,一种没有在 MSBuild XML 中明确声明 HTML 标记的方式。换句话说,我对正常的约束不满意,我正在寻找一个 MSBuild API 调用或其他可以让我绕过它们而不是形式上的变通方法的东西。
标签: msbuild msbuild-task msbuild-4.0