我目前正在尝试使用 Visual Studio 2010“发布”和 MSDeploy 功能来处理我的 Web 部署需求,但在根据我的构建配置自定义包方面遇到了障碍。
我在32位环境中开发,但需要为64位环境创建发布包,因此在“发布”配置中我有一个构建后事件,该事件将第三方dll的64位版本复制到bin目录中覆盖32位版本。当我使用“发布”功能时,即使正确的 64 位 dll 被复制到 bin 目录,它也不会包含在包中。
有没有办法让“发布”包含在构建后事件期间复制到 bin 目录中的文件?
最佳答案
我在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
,我们可以利用它并注入(inject)我们自己的目标。因此,我们将创建一个名为 CustomCollectFiles
的目标并将其注入(inject)到进程中。我们通过以下内容实现这一点(记住在 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
来执行此操作。例如,假设您的 Web 应用程序中包含名为 Sample.Debug.js 的文件,但您希望从创建的包中排除该文件。您可以将下面的代码片段放在导入语句之后。
<ItemGroup>
<ExcludeFromPackageFiles Include="Sample.Debug.xml">
<FromTarget>Project</FromTarget>
</ExcludeFromPackageFiles>
</ItemGroup>
通过声明填充此项目,文件将自动被排除。请注意此处 FromTarget
元数据的用法。我不会在这里讨论这一点,但您应该知道始终要指定这一点。
关于asp.net - 如何获取 Visual Studio 'Publish' 功能以包含生成后事件中的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3137880/