我在每次构建后使用_bin_deployableAssemblies文件夹将ASP.NET MVC程序集复制到bin文件夹。不幸的是,MSBuild任务还复制了隐藏的.svn文件夹。
我想在项目级别解决此问题,因此我在.csproj文件中的RemoveDir
目标中添加了AfterBuild
任务,该文件适用于普通版本。
<RemoveDir Directories="@(OutDir).svn" />
但是当我发布该网站时,它似乎无效。发布后,.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>
使用Message
目标中的AfterBuild
任务,我可以看到此项目组包含.svn文件夹中的所有文件。
所以我尝试了以下技巧来调整.AfterBuild目标中的项目组:
<ItemGroup>
<_binDeployableAssemblies Remove="$(MSBuildProjectDirectory)\_bin_deployableAssemblies\.svn\**\*.*" />
</ItemGroup>
如果我使用Message
任务打印文件列表,我可以看到它不再包含.svn文件夹中的文件。 但,在构建或发布时,.svn文件仍会复制到输出文件夹中!
似乎Publish命令首先进行常规构建,此时我们可以使用AfterBuild目标删除文件。但随后它将文件复制到临时位置(在/ obj文件夹中)以便发布它们。在此阶段,它似乎将所有内容从_bin_deployableAssemblies复制到bin 再次,然后才将bin(和其他项目文件)复制到临时位置。这似乎发生在之后在AfterBuild之后。
所以诀窍可能是在将项目文件复制到临时文件夹之前挂钩进程。或者之后,不仅需要清除临时文件夹,还需要第二次清除原始bin文件夹。这可能是通过钩住许多DependsOn目标中的一个来实现的。
如果没有合适的目标来执行此操作,那么从某些中间项目组中删除文件可能是一种解决方案,因此它们实际上从未被复制或发布。
由于缺乏对发布流程的理解,我无法实现这些可能的修复。
如何防止文件被复制或复制后删除文件?如何为常规版本和发布命令执行此操作?
答案 0 :(得分: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>
适用于构建,打包和发布!