92

我目前正在尝试使用 Visual Studio 2010 的“发布”和 MSDeploy 功能来处理我的 Web 部署需求,但在根据我的构建配置自定义包方面遇到了障碍。

我在 32 位环境中开发,但需要为 64 位环境创建发布包,因此在“发布”配置中,我有一个构建后事件,将第三方 dll 的 64 位版本复制到 bin 目录中,覆盖 32 位版本. 当我使用“发布”功能时,即使将正确的 64 位 dll 复制到 bin 目录,它也不会包含在包中。

有没有办法让“发布”包含在构建后事件期间复制到 bin 目录中的文件?

4

6 回答 6

94

我在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此处元数据的使用。我不会在这里讨论,但您应该知道始终指定这一点。

于 2010-06-30T00:31:47.997 回答
13

ExcludeFilesFromDeployment我通过使用项目文件中的元素找到了解决该问题的方法。我从Web 部署中得到了这个想法:排除文件和文件夹

因此,如果您需要在成功构建和相关的构建后步骤后打包项目目录中存在的项目文件,请执行以下操作。

  1. 编辑“打包/发布 Web”项目设置并
    选择要部署的项目为“此项目文件夹中的所有文件”
  2. 卸载项目
  3. 右键单击卸载的项目并选择编辑项目配置
  4. 找到与PropertyGroup配置设置关联的元素,例如“发布”
  5. PropertyGroup元素中添加以下元素并排除包中不需要的文件和文件夹

    <ExcludeFilesFromDeployment>*.cs;**\.svn\**\*.*;Web.*.config;*.csproj*</ExcludeFilesFromDeployment>
    <ExcludeFoldersFromDeployment>.svn;Controllers;BootstrapperTasks;Properties</ExcludeFoldersFromDeployment>
    
  6. 保存并重新加载您的项目

这暂时解决了我的问题,但是如果有更好的解决方案,请告诉我,因为这并不理想,因为涉及到黑客,但话又说回来,也许这是一个不常见的部署场景?

于 2010-06-29T11:53:53.447 回答
8

从属性窗口中选择您的文件或文件夹并将生成操作更改为内容。

于 2014-01-29T12:45:57.663 回答
3

我知道这是一个老问题,但这些都不适合我。

在 2017 VS 中,我只是右键单击要发布的额外文件夹并选择发布它工作。

例子:

在此处输入图像描述

于 2018-04-22T15:37:04.470 回答
0

我知道这是一个古老的对话,但我在尝试做同样的事情时遇到了它,我认为添加我在这里找到的内容会有所帮助。

几乎所有关于在出版物中包含额外文件的文章都CopyAllFilesToSingleFolderForPackageDependsOn使用这种CopyAllFilesToSingleFolderForMSDeployDependsOnPropertyGroup

这就是我所做的,花了一个下午试图找出为什么什么都没有发生,直到我意识到PropertyGroup文件顶部已经有一个部分。当我将CopyAllFilesToSingleFolderForPackageDependsOn其放入该部分时,它运行良好。

希望有一天这可以节省某人的时间

于 2018-09-25T08:37:29.757 回答
0

将 bin 文件夹(及其内容)添加到项目会导致文件被复制到发布输出目录。

对我来说,我的问题是我需要在 bin/ 文件夹中放置一个专有软件许可证文件,但不想在每次部署时手动复制它。

这是使用 Visual Studio 2015 Professional

于 2017-03-16T22:03:11.563 回答