MSBuild的ItemGroup,排除.svn目录和其中的文件

40

我如何构建一个MSBuild ItemGroup来排除 .svn 目录及其下所有文件(递归)?我已经有:

<ItemGroup> 
     <LibraryFiles Include="$(LibrariesReleaseDir)\**\*.*" Exclude=".svn" />
</ItemGroup>

目前的情况是这样,但这并不排除任何可能性!

4个回答

64

感谢您的帮助,我按照以下方式解决了它:

<ItemGroup>
     <LibraryFiles Include="$(LibrariesReleaseDir)\**\*.*" 
                   Exclude="$(LibrariesReleaseDir)\**\.svn\**" />
</ItemGroup>

原来模式匹配基本上是在文件上运行的,因此您必须排除所有在.svn目录(.svn\\**)下面的内容,使MSBuild可以排除.svn目录本身。


1
@Kieran Benton:感谢您的更新,我将提交一个connect.microsoft.com请求以澄清MSDN文档。 - user7116
1
我注意到你在排除值中也加了前缀"$(LibrariesReleaseDir)\**\"(与你在原帖中的值相比)。这有什么重要意义吗? - user212218

12

所以问题出在使用msbuild链接变量时。下面的代码对我来说是可以工作的,注意我只能使用基于MSBuildProjectDirectory变量的相对路径。

<CreateItem Include="$(MSBuildProjectDirectory)\..\Client\Web\Foo.Web.UI\**\*.*"
            Exclude="$(MSBuildProjectDirectory)\..\Client\Web\Foo.Web.UI\**\.svn\**">
  <Output TaskParameter="Include" ItemName="WebFiles" />
</CreateItem>

以下代码不起作用:

<PropertyGroup>
    <WebProjectDir>$(MSBuildProjectDirectory)\..\Client\Web\Foo.Web.UI</WebProjectDir>
</PropertyGroup>
<CreateItem Include="$(WebProjectDir)\**\*.*"
            Exclude="$(WebProjectDir)\**\.svn\**">
  <Output TaskParameter="Include" ItemName="WebFiles" />
</CreateItem>

非常奇怪!我刚花了三个小时处理这个问题。


3

这里有一种更好的方法,可以真正地进行递归。我似乎无法让您的解决方案超过1层深度:

<LibraryFiles  
    Include="$(LibrariesReleaseDir)**\*.*"  
    Exclude="$(LibrariesReleaseDir)**\.svn\**\*.*"/>

1
这个能够在 .svn\entries 文件上工作吗?考虑到文件名中没有点号。 - user212218

1

我在使用包含/排除方法时遇到了一些故障,所以这里是一个对我有效的替代方案:

<ItemGroup>
    <MyFiles Include=".\PathToYourStuff\**" />
    <MyFiles Remove=".\PathToYourStuff\**\.svn\**" />
</ItemGroup>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接