断言包含通配符中的项目数

时间:2016-12-20 13:47:46

标签: c# .net visual-studio msbuild

我有一个C#项目,我需要将文件作为资源包含在内。我事先并不知道该文件的全名,因为它将包含我在构建时无法轻松访问的版本号。所以我使用这样的通配符:

  <ItemGroup>
    <EmbeddedResource Include="..\..\setup\bin\MyApp-setup-*.exe">
      <Link>Setup\%(filename)%(extension)</Link>
      <LogicalName>Setup\%(filename)%(extension)</LogicalName>
    </EmbeddedResource>
  </ItemGroup>

它有效,但问题是它可以包含任意数量的文件,我希望它只包含一个。文件夹中应该只有一个匹配的文件。如果有零个或多个文件与通配符匹配,我希望它是一个构建错误。有没有办法断言只包含一个文件?

编辑:感谢@ stijn的回答,我能够这样做:

  <Target Name="BeforeBuild">
    <ItemGroup>
      <EmbeddedResource Include="..\..\setup\bin\MyApp-setup-*.exe">
        <Link>AppFiles\%(filename)%(extension)</Link>
        <LogicalName>AppFiles\%(filename)%(extension)</LogicalName>
      </EmbeddedResource>
    </ItemGroup>
    <PropertyGroup>
      <SetupFileCount>@(EmbeddedResource->Count())</SetupFileCount>
    </PropertyGroup>
    <Error Text="Expected exactly one file matching 'MyApp-setup-*'; found $(SetupFileCount)." Condition="'$(SetupFileCount)' != '1'"/>
  </Target>

1 个答案:

答案 0 :(得分:1)

使用Item Function'Count'获取商品数量,如果不是1,则引发错误:

<Target Name="ErrorIfNotOneEmbeddedResourceFound" BeforeTargets="Build">
  <ItemGroup>
    <EmbeddedResource Include="..\..\setup\bin\MyApp-setup-*.exe">
      <Link>Setup\%(filename)%(extension)</Link>
      <LogicalName>Setup\%(filename)%(extension)</LogicalName>
    </EmbeddedResource>
  </ItemGroup>
  <Error Text="Didn't find one match" Condition="'@(EmbeddedResource->Count())' != '1'"/>
</Target>