我有一个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>
答案 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>