我在How do you include additional files using VS2010 web deployment packages中回答了一个类似但不同的问题?.
在您使用构建后事件的场景中,我建议您删除构建后事件并使用您自己的 MSBuild 目标而不是构建后事件来实施您的操作。您将在下面找到另一个答案的文本。
来自:如何使用 VS2010 Web 部署包包含附加文件?
好问题。我刚刚在Web 部署工具 (MSDeploy) 上发布了一个非常详细的博客条目:包含额外文件或排除特定文件的构建包。
这是概要。在包含文件之后,我还将展示如何排除文件。
包括额外文件
在包中包含额外的文件有点困难,但如果您对 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
值。这将确定它将被放置在包中的相对路径。我在这里使用了额外的声明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 应用程序中,但您希望将该文件从创建的包中排除。您可以将下面的代码段放在该导入语句之后。
<ItemGroup>
<ExcludeFromPackageFiles Include="Sample.Debug.xml">
<FromTarget>Project</FromTarget>
</ExcludeFromPackageFiles>
</ItemGroup>
通过声明填充此项,文件将被自动排除。请注意FromTarget
此处元数据的使用。我不会在这里讨论,但您应该知道始终指定这一点。