简短答案 - 显式导入
我必须做的:
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v12.0\Web\Microsoft.Web.Publishing.targets" Condition="!Exists('$(VSToolsPath)\Web\Microsoft.Web.Publishing.targets')" />
长答案
当您在 VS2013 中执行 File -> New Web Project 时,您会在 *.csproj 文件中获得以下内容:
<PropertyGroup>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
</PropertyGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />
在构建机器和多台开发机器上$(VisualStudioVersion)
总是对我进行评估。11.0
即使在带有 VS2013 的机器上,也就是12.0
.
深入研究,我发现在Microsoft.WebApplication.targets
上面,它有一行来导入我们真正想要的文件,Microsoft.Web.Publishing.targets
只有当它像第 377 行那样存在时:
<!--Import publishing target-->
<Import Project="..\Web\Microsoft.Web.Publishing.targets" Condition="Exists('..\Web\Microsoft.Web.Publishing.targets')" />
所以对我来说,这是对Microsoft.Web.Publishing.targets
.
问题是如果这个文件不存在,它什么也不做,直到你在尝试使用TransformXml
任务时遇到错误时你才知道它。
安装VS2013没有安装Microsoft.Web.Publishing.targets
在11.0
目录中。它确实将其安装在12.0
目录中。我猜如果我安装了 VS2012,它会做到的。
无论如何,如果它不存在并且没有像这样隐式导入,我可以通过从目录中显式导入来解决它:Microsoft.Web.Publishing.targets
12.0
Microsoft.WebApplication.targets
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v12.0\Web\Microsoft.Web.Publishing.targets" Condition="!Exists('$(VSToolsPath)\Web\Microsoft.Web.Publishing.targets')" />