我在How do you include additional files using VS2010 web deployment packages? 回答了一个类似但不同的问题。
在您使用构建后事件的场景中,我建议您删除构建后事件并使用您自己的 MSBuild 目标而不是构建后事件来实施您的操作。您将在下面找到另一个答案的文本。
发件人:How do you include additional files using VS2010 web deployment packages?
很好的问题。我刚刚在Web Deployment Tool (MSDeploy) : Build Package including extra files or excluding specific files 上发布了一篇非常详细的博客文章。
这里是概要。包含文件后,我还将展示如何排除文件。
包括额外文件
在包中包含额外的文件有点困难,但如果您对 MSBuild 感到满意,但仍然没有什么大不了的,如果您不熟悉,请阅读本文。为了做到这一点,我们需要挂钩收集用于打包的文件的过程部分。我们需要扩展的目标称为CopyAllFilesToSingleFolder。这个目标有一个依赖属性PipelinePreDeployCopyAllFilesToOneFolderDependsOn,我们可以利用它并注入我们自己的目标。因此,我们将创建一个名为 CustomCollectFiles 的目标并将其注入到进程中。我们通过以下方式实现这一点(请记住在 import 语句之后)。
<PropertyGroup>
<CopyAllFilesToSingleFolderForPackageDependsOn>
CustomCollectFiles;
$(CopyAllFilesToSingleFolderForPackageDependsOn);
</CopyAllFilesToSingleFolderForPackageDependsOn>
</PropertyGroup>
这会将我们的目标添加到流程中,现在我们需要定义目标本身。假设您有一个名为 Extra Files 的文件夹,它位于您的 Web 项目上方 1 级。您想要包含所有这些文件。这里是CustomCollectFiles 目标,我们之后再讨论。
<Target Name="CustomCollectFiles">
<ItemGroup>
<_CustomFiles Include="..\Extra Files\**\*" />
<FilesForPackagingFromProject Include="%(_CustomFiles.Identity)">
<DestinationRelativePath>Extra Files\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
</FilesForPackagingFromProject>
</ItemGroup>
</Target>
我在这里所做的是创建项目 _CustomFiles 并在 Include 属性中告诉它拾取该文件夹中的所有文件以及它下面的任何文件夹。然后我使用这个项目来填充FilesForPackagingFromProject 项目。这是 MSDeploy 实际用于添加额外文件的项目。另请注意,我声明了元数据 DestinationRelativePath 值。这将确定它将被放置在包中的相对路径。我在这里使用了 Extra Files%(RecursiveDir)%(Filename)%(Extension) 声明。这就是说将它放在包中与 Extra Files 文件夹下相同的相对位置。
排除文件
如果您打开使用 VS 2010 创建的 Web 应用程序的项目文件,您会在其底部找到一行。
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
顺便说一句,您可以在 VS 中打开项目文件。右键单击项目选择卸载项目。然后右键单击卸载的项目并选择编辑项目。
此声明将包括我们需要的所有目标和任务。如果您不确定是否在之后进行,我们的大多数定制都应该在该导入之后!因此,如果您有要排除的文件,则可以使用项目名称ExcludeFromPackageFiles 来执行此操作。例如,假设您有一个名为 Sample.Debug.js 的文件,该文件包含在您的 Web 应用程序中,但您希望将该文件从创建的包中排除。您可以将 sn-p 放在该 import 语句之后。
<ItemGroup>
<ExcludeFromPackageFiles Include="Sample.Debug.xml">
<FromTarget>Project</FromTarget>
</ExcludeFromPackageFiles>
</ItemGroup>
通过声明填充此项,文件将被自动排除。请注意此处FromTarget 元数据的使用。我不会在这里讨论,但你应该知道总是指定。