我有一个任务,我根据扩展名选择一些文件,但是想要一些文件夹没有被处理。问题是似乎在包含过滤器之前应用了排除过滤器,所以最后包含了所有文件。
这是我选择文件的地方:
<CreateItem Exclude="**\.svn\**;
$(MSBuildProjectDirectory)\obj\**;
$(MSBuildProjectDirectory)\bin\**;
$(MSBuildProjectDirectory)\My Project\*.*;
$(MSBuildProjectDirectory)\Properties\*.*;
$(MSBuildProjectDirectory)\Dependencies\*.*;
$(MSBuildProjectDirectory)\Installation\**;
$(MSBuildProjectDirectory)\Extenders\**\*.*"
Include="$(MSBuildProjectDirectory)\**\*.ascx;
$(MSBuildProjectDirectory)\**\*.aspx;
$(MSBuildProjectDirectory)\**\*.css;
$(MSBuildProjectDirectory)\**\*.xml;
$(MSBuildProjectDirectory)\**\*.xslt;
$(MSBuildProjectDirectory)\**\*.js;
$(MSBuildProjectDirectory)\**\*.resx;
$(MSBuildProjectDirectory)\**\*.rpt;
$(MSBuildProjectDirectory)\**\*.gif;
$(MSBuildProjectDirectory)\**\*.jpg;
$(MSBuildProjectDirectory)\**\*.png;"
&GT;
在这种情况下,如果任何“排除”文件夹包含任何扩展名与“包含”列表匹配的文件,它仍将包含在最终列表中。
所以问题是如何强制排除文件夹中的所有文件实际上都是排除的。
编辑:似乎MsBuild文件中还有另一个问题导致此操作失败。 它按预期工作。
答案 0 :(得分:2)
在MSDN上,您可以读到不推荐使用CreateItem任务。建议使用ItemGroup,因为.net 3.5可以将它嵌入到目标中。在您的情况下,如果您想确保在包含后运行排除,您可以写:
<ItemGroup>
<YourItemName Include="$(MSBuildProjectDirectory)\**\*.ascx;$(MSBuildProjectDirectory)\**\*.aspx;$(MSBuildProjectDirectory)\**\*.css;$(MSBuildProjectDirectory)\**\*.xml;$(MSBuildProjectDirectory)\**\*.xslt;$(MSBuildProjectDirectory)\**\*.js;$(MSBuildProjectDirectory)\**\*.resx;$(MSBuildProjectDirectory)\**\*.rpt;$(MSBuildProjectDirectory)\**\*.gif;$(MSBuildProjectDirectory)\**\*.jpg;$(MSBuildProjectDirectory)\**\*.png;" Exclude="**\.svn\**;$(MSBuildProjectDirectory)\obj\**;$(MSBuildProjectDirectory)\bin\**;$(MSBuildProjectDirectory)\My Project\*.*;$(MSBuildProjectDirectory)\Properties\*.*;$(MSBuildProjectDirectory)\Dependencies\*.*;$(MSBuildProjectDirectory)\Installation\**;$(MSBuildProjectDirectory)\Extenders\**\*.*"/>
</ItemGroup>
我知道你已经把它整理出来,但是我发布它以防其他人遇到类似的问题。如果要在代码中包含来自多个源和许多位置的数据,则ItemGroup会更有用。