如何防止从_bin_deployableAssemblies文件夹中复制隐藏的.svn文件夹?

Mic*_*out 4 svn asp.net msbuild visual-studio-2010 web-deployment

我在每次构建后使用_bin_deployableAssemblies文件夹将ASP.NET MVC程序集复制到bin文件夹.不幸的是,MSBuild任务还复制了隐藏的.svn文件夹.

第一次尝试修复

我想在项目级别解决这个问题,所以我在.csproj文件中RemoveDirAfterBuild目标添加了一个任务,该文件适用于普通版本.

<RemoveDir Directories="@(OutDir).svn" />
Run Code Online (Sandbox Code Playgroud)

但是,当我发布网站时,它似乎不起作用.发布后,.svn文件夹将复制到发布向导的目标文件夹中.奇怪的是,尽管有RemoveDir任务,它也会在项目的/ bin文件夹中结束!

在目标文件中C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets,动态创建项目组以包含文件夹_bin_deployableAssemblies中的所有文件:

<CreateItem Include="$(MSBuildProjectDirectory)\_bin_deployableAssemblies\**\*.*" 
            Condition="Exists('$(MSBuildProjectDirectory)\_bin_deployableAssemblies')">
    <Output ItemName="_binDeployableAssemblies" TaskParameter="Include"/>
</CreateItem>
Run Code Online (Sandbox Code Playgroud)

使用目标中的Message任务,AfterBuild我可以看到此项目组包含.svn文件夹中的所有文件.

第二次尝试修复

所以我尝试了以下技巧来调整.AfterBuild目标中的项目组:

<ItemGroup>
    <_binDeployableAssemblies Remove="$(MSBuildProjectDirectory)\_bin_deployableAssemblies\.svn\**\*.*" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

如果我在使用Message任务之后打印文件列表,我可以看到它不再包含.svn文件夹中的文件.但是,在构建或发布时,.svn文件仍会复制到输出文件夹中!

可能的实际修复

似乎Publish命令首先进行常规构建,此时我们可以使用AfterBuild目标删除文件.但随后它将文件复制到临时位置(在/ obj文件夹中)以便发布它们.在这个阶段,似乎它拷贝一切从_bin_deployableAssemblies到仓再次才把拷贝箱(及其他项目文件)的临时位置.这似乎发生 AfterBuild 之后.

因此,技巧可能是在将项目文件复制到临时文件夹之前挂钩到某个进程.或者之后,不仅需要清除临时文件夹,还需要第二次清除原始bin文件夹.这可以通过钩入许多DependsOn目标中的一个来实现.

如果没有合适的目标来执行此操作,那么从某个中间项组中删除文件可能是一种解决方案,因此它们实际上从未被复制或发布.

由于缺乏对发布流程的理解,我无法实现这些可能的修复.

主要问题

如何防止文件被复制或复制后删除文件?如何为常规版本和发布命令执行此操作?

mth*_*rba 5

将其添加到.csproj文件(或{projectName}.wpp.targets文件):

  <PropertyGroup>
    <OnAfterCopyAllFilesToSingleFolderForPackage>
      __RemoveSvnFromPackageTemp
    </OnAfterCopyAllFilesToSingleFolderForPackage>
  </PropertyGroup>

  <Target Name="__RemoveSvnFromBin" AfterTargets="_CopyBinDeployableAssemblies">
    <Message Text="Removing .SVN from BIN" Importance="normal"/>
    <RemoveDir Directories="$(OutDir).svn" />
  </Target>

  <Target Name="__RemoveSvnFromPackageTemp">
    <Message Text="Removing .SVN from PackageTempDir" Importance="normal"/>
    <RemoveDir Directories="$(_PackageTempDir)\bin\.svn" />
  </Target>
Run Code Online (Sandbox Code Playgroud)

这适用于构建,打包和发布!