asp.net - 如何获取 Visual Studio 'Publish' 功能以包含生成后事件中的文件?

标签 asp.net visual-studio-2010 build-process publishing msdeploy

我目前正在尝试使用 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/

相关文章:

visual-studio - Visual Studio 链接,但没有任何变化

c# - ASP.NET 和 C# : MessageBox not shown when used in combination with Response. 重定向

ASP.NET Gridview 按钮 onclick 未触发

javascript - 如何让浏览器不解析从 javascript 添加的新 HTML 代码

asp.net - 使用单独的项目记录 Log4Net 时的 Web.config 配置

visual-studio-2010 - VS2010中使用Ctrl-Tab切换文档需要返回

c++ - 如何制作一个无边框的winform应用程序?

visual-studio - 如何从 Visual Studio 2010 运行 PowerShell 脚本

powershell - 如何控制 Hyper-V VM 控制台中的进程?

build-process - 与多个项目/语言/环境的持续集成