如何让Visual Studio的“发布”功能包含后期构建事件中的文件?

时间:2010-06-29 04:34:10

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

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

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

有没有办法让'Publish'包含在post build事件期间复制到bin目录中的文件?

6 个答案:

答案 0 :(得分:86)

我在How do you include additional files using VS2010 web deployment packages?回答了类似但又不同的问题。

在您的场景中,您正在使用post build事件,我建议您删除post build事件并使用您自己的MSBuild目标而不是post build事件来实现您的操作。您可以在下面找到其他答案的文字。


来自: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感到满意,那么将额外的文件包含在包中会有点困难,但仍然没有bigee,如果您不熟悉,请阅读此内容。为了做到这一点,我们需要挂钩收集文件以进行打包的过程部分。我们需要扩展的目标称为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值。这将确定它将放置在包中的相对路径。我在这里使用语句Extra Files%(RecursiveDir)%(Filename)%(Extension)。这就是将它放在包中与Extra Files文件夹下相同的相对位置。

排除文件

如果您打开使用VS 2010创建的Web应用程序的项目文件,则会在其底部找到一行。

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />

BTW你可以在VS里面打开项目文件。右键单击项目选择卸载项目。然后右键单击卸载的项目并选择Edit Project。

此声明将包含我们需要的所有目标和任务。我们的大多数自定义都应该在导入之后,如果您不确定是否放在后面!因此,如果您要排除文件,则可以使用项目名称ExcludeFromPackageFiles来执行此操作。例如,假设您有一个名为Sample.Debug.js的文件,该文件包含在您的Web应用程序中,但您希望从创建的包中排除该文件。您可以在导入语句之后放置下面的代码段。

<ItemGroup>
  <ExcludeFromPackageFiles Include="Sample.Debug.xml">
    <FromTarget>Project</FromTarget>
  </ExcludeFromPackageFiles>
</ItemGroup>

通过声明填充此项目,将自动排除文件。请注意此处使用FromTarget元数据。我不会在这里讨论,但你应该知道总是指明这一点。

答案 1 :(得分:13)

我通过在项目文件中使用ExcludeFilesFromDeployment元素找到了解决问题的方法。我从Web Deployment: Excluding Files and Folders

得到了这个想法

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

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

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

  7. 这暂时解决了我的问题但是如果有更好的解决方案那么请告诉我,因为涉及到hackery这不是理想的,但是这可能是一个不常见的部署场景?

答案 2 :(得分:4)

选择您的文件或文件夹,并将“构建操作”更改为“属性窗口中的内容”。

答案 3 :(得分:1)

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

2017年VS我刚刚点击了要发布的额外文件夹,然后选择发布它。

示例:

enter image description here

答案 4 :(得分:0)

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

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

这是使用Visual Studio 2015专业版

答案 5 :(得分:0)

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

几乎所有关于在出版物中包含额外文件的文章都使用这种方法在CopyAllFilesToSingleFolderForPackageDependsOn中添加CopyAllFilesToSingleFolderForMSDeployDependsOnPropertyGroup项,它们都与“我将其添加到文件末尾...”

这就是我所做的事情,并且花了一个下午的时间试图找出为什么什么也没发生,直到我意识到文件顶部已经有一个PropertyGroup部分。当我将CopyAllFilesToSingleFolderForPackageDependsOn放入该部分时,效果很好。

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