Deployment 是否可以使用条件验证UsingTask的AssemblyFile属性是否存在?

Deployment 是否可以使用条件验证UsingTask的AssemblyFile属性是否存在?,deployment,msbuild,Deployment,Msbuild,是否可以使用条件验证UsingTask的汇编文件属性的存在 <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll" Condition="Exists('$(MSBuildExtensionsPath)\Micr

是否可以使用
条件
验证
UsingTask
汇编文件
属性的存在

<UsingTask 
        TaskName="TransformXml" 
        AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll"
        Condition="Exists('$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\')"/>

<UsingTask 
        TaskName="TransformXml" 
        AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v11.0\Web\Microsoft.Web.Publishing.Tasks.dll"
        Condition="Exists('$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v11.0\')"/>

更新:

在使用不存在的路径测试代码之后,我复制了您的错误。在任务dll被挑战加载后,可能会对条件进行评估

通过首先构建路径(使用
$(VisualStudioVersion)
或手动创建路径,可以修改代码以消除错误:

<Project ToolsVersion="4.0" DefaultTargets="Echo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">  

    <PropertyGroup>
        <VSExtPath>$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\</VSExtPath>
        <VSExtPath Condition="Exists('$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v11.0')">$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v11.0\</VSExtPath>
    </PropertyGroup>

    <UsingTask 
        TaskName="TransformXml" 
        AssemblyFile="$(VSExtPath)\Web\Microsoft.Web.Publishing.Tasks.dll" />

    <Target Name="Echo">
        <Message Text="$(VSExtPath)" />     
        <TransformXml />
    </Target>
</Project>

从.net 4.5开始,
$(VisualStudioVersion)
属性由MSBuild设置(设置为可用的最高版本)。请参阅详细信息,他们通常使用$(VisaulStudioVersion)属性:默认情况下,它被设置为可用的最高值,并且可以从CMD参数中覆盖。有关详细信息,请参阅我不在Visual Studio中构建,因此我认为
$(VisualStudioVersion)
可用。无论如何,我都很难获得排除UsingTask的条件。我很确定,它是可用的。(它在您的.csproj文件中定义)。请参阅我提供的链接中的详细信息。唯一的问题是,有时此属性在生成服务器上设置不正确。要消除此问题,我始终通过/p:VisualStudioVersion=11(或10)在我的生成脚本中,当我需要特定版本时。我的问题与确定安装了哪个版本的visual studio无关。我的问题是,该条件没有阻止对UsingTask进行求值,因为路径不存在,它会抛出一个错误。@JeremySmith,但您想使用最新的可用版本吗Microsoft.Web.Publishing.Tasks.dll的版本,righ?因此我提供的代码将使用v11.0(如果可用),否则-使用v10.0。@JeremySmith,顺便说一句,我刚刚测试了您的原始代码:条件在我的机器上按预期工作(即,如果可用,则加载v11.0;如果尝试使用TransformXml任务时未发现生成中断,则使用v10.0。我的计算机(v10.0)上的不同开发人员PC上运行的生成代理具有不同版本的studio。)TransformXml任务失败,但错误显示它在\v11.0目录中找不到源代码…这使我认为条件工作不正常。您使用的是v11.0?@JeremySmith,我两者都有。我认为您的代码工作正常,因为我尝试在条件语句中为其提供不存在的路径,而不是导入。现在我重新编写了已解决您的问题。我已更新代码以解决此问题。注意:更新的基于属性的代码应该可以正常工作。但是,您仍然可以使用原始的基于$(VisualStudioVersion)的解决方案。
<PropertyGroup>

    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
</PropertyGroup>
<UsingTask 
        TaskName="TransformXml" 
        AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />