为什么MsBuild的ItemGroup-> EndWith不适用于' .exe'?

时间:2015-07-16 16:08:48

标签: c# msbuild

我试图创建一个dll和exe的项目组,但过滤掉所有msi和test.dll。

以下代码段不包含UniqueAssemblies项目组中的.exe。它确实包含所有的dll,并按预期删除了msi。 UniqueCompiledFiles包含所有预期的输出文件(.test.dll,.dll,.msi,.exe)

<Target Name="CustomCompile">
<MSBuild
  BuildInParallel="true"
  Projects="@(ProjectFiles)"
  Properties="$(ProjectProperties)"
>
  <Output TaskParameter="TargetOutputs" ItemName="CompiledFiles" />
</MSBuild>
<RemoveDuplicates Inputs="@(CompiledFiles)">
  <Output TaskParameter="Filtered" ItemName="UniqueCompiledFiles" />
</RemoveDuplicates>

<ItemGroup>
  <UniqueAssemblies
    Include="%(UniqueCompiledFiles.Identity)"
    Condition=" '@(UniqueCompiledFiles->EndsWith('.dll'))' == 'true' " />
  <UniqueAssemblies
    Include="%(UniqueCompiledFiles.Identity)"
    Condition=" '@(UniqueCompiledFiles->EndsWith('.exe'))' == 'true' " />
</ItemGroup>

我还想出了正确过滤.exe的这种解决方法。

<ItemGroup>
  <UniqueAssemblies2
      Include="%(UniqueCompiledFiles.Identity)"
      Condition=" $([System.String]::new('%(UniqueCompiledFiles.Identity)').EndsWith('.exe')) " />
</ItemGroup>

找出可以删除以修复问题的罪魁祸首,但它实际上并没有回答这个问题。

<ItemGroup>
  <!-- Workaround for MSBuild defect: https://github.com/Microsoft/msbuild/issues/69 -->
  <UniqueCompiledFiles Include="Project\bin\release\Project.exe">
    <MSBuildSourceProjectFile>Project\Project.csproj</MSBuildSourceProjectFile>
    <Platform>x86</Platform>
  </UniqueCompiledFiles>
</ItemGroup>

为什么@(UniqueCompiledFiles->EndsWith('.exe'))语法无法正常工作?

1 个答案:

答案 0 :(得分:0)

您尝试在项目(而不是属性)上使用Property Function

您应该能够通过使用以下内容获得所需的结果:

<ItemGroup>
  <UniqueAssemblies2
    Include="%(UniqueCompiledFiles.Identity)"
    Condition=" '%(Extension)' == '.exe' " />
</ItemGroup>