我在“ 如何使用VS2010 Web部署程序包包括其他文件”中回答了类似但不同的问题?。
在您使用场景的事件后,我建议您删除事件后事件,并使用自己的MSBuild目标而不是事件后事件来实施操作。在下面,您将找到其他答案的文本。
来自:如何使用VS2010 Web部署程序包包含其他文件?
好问题。我刚刚在Web部署工具(MSDeploy)上发布了一个关于此的非常详细的博客条目:构建包,包括额外的文件或不包括特定的文件。
这是摘要。包含文件后,我还将展示如何排除文件。
包括额外文件
如果您对MSBuild感到满意,那么将额外的文件包含到程序包中会比较困难,但是仍然不算什么,如果您不熟悉MSBuild,请阅读此内容。为此,我们需要进入收集文件打包过程的一部分。我们需要扩展的目标称为CopyAllFilesToSingleFolder。该目标具有依赖项属性PipelinePreDeployCopyAllFilesToOneFolderDependsOn,我们可以利用该属性插入自己的目标。因此,我们将创建一个名为CustomCollectFiles的目标,并将其注入到流程中。我们通过以下方式实现这一点(请记住import语句之后)。
<PropertyGroup>
<CopyAllFilesToSingleFolderForPackageDependsOn>
CustomCollectFiles;
$(CopyAllFilesToSingleFolderForPackageDependsOn);
</CopyAllFilesToSingleFolderForPackageDependsOn>
</PropertyGroup>
这会将我们的目标添加到流程中,现在我们需要定义目标本身。假设您有一个名为Extra Files的文件夹,该文件夹位于Web项目的上一级。您要包括所有这些文件。这是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应用程序中,但是您希望将该文件从创建的包中排除。您可以将该代码段放在该import语句之后。
<ItemGroup>
<ExcludeFromPackageFiles Include="Sample.Debug.xml">
<FromTarget>Project</FromTarget>
</ExcludeFromPackageFiles>
</ItemGroup>
通过声明填充此项目,文件将被自动排除。请注意FromTarget元数据的用法。我在这里不做讨论,但是您应该知道始终指定它。