关于asp.net:如何获得Visual Studio’发布’功能以包含来自后期构建事件的文件?

How to get Visual Studio 'Publish' functionality to include files from post build event?

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

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

有没有办法让"发布"包含在后期生成事件期间复制到bin目录的文件?


我回答了一个类似但不同的问题,即如何使用VS2010 Web部署包包含其他文件?.

在您使用生成后事件的场景中,我建议删除生成后事件,并使用自己的msbuild目标而不是生成后事件来实现操作。下面是另一个答案的文本。

发件人:如何使用VS2010 Web部署包包含其他文件?

好问题。我刚刚在Web部署工具(msdeploy)上发布了一个非常详细的日志:构建包含额外文件或排除特定文件的包。

这是概要。在包含了文件之后,我还演示了如何排除文件。

包括额外的文件

将额外的文件包含到包中有点困难,但是如果您对msbuild感到满意,那么仍然没有什么大不了的,如果您不满意,那么请阅读本文。为了做到这一点,我们需要钩住收集文件进行打包的过程的一部分。我们需要扩展的目标称为copyallfilestosinglefolder。此目标具有依赖属性PipelinePreDeployCopyAllFilesToOneFolderDependson,我们可以点击并插入自己的目标。所以我们将创建一个名为customcollectfiles的目标并将其注入到进程中。我们通过以下方法实现这一点(记住在import语句之后)。

1
2
3
4
5
6
<PropertyGroup>
  <CopyAllFilesToSingleFolderForPackageDependsOn>
    CustomCollectFiles;
    $(CopyAllFilesToSingleFolderForPackageDependsOn);
  </CopyAllFilesToSingleFolderForPackageDependsOn>
</PropertyGroup>

这将把我们的目标添加到流程中,现在我们需要定义目标本身。假设您有一个名为"额外文件"的文件夹,该文件夹位于Web项目上方的1级。您希望包括所有这些文件。这是CustomCollectFiles的目标,之后我们再讨论。

1
2
3
4
5
6
7
8
9
<Target Name="CustomCollectFiles">
  <ItemGroup>
    <_CustomFiles Include="..\Extra Files\**\*" />

    <FilesForPackagingFromProject  Include="%(_CustomFiles.Identity)">
      <DestinationRelativePath>Extra Files\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
    </FilesForPackagingFromProject>
  </ItemGroup>
</Target>

在这里,我所做的是创建项目_customfiles,并在include属性中告诉它拾取该文件夹及其下的任何文件夹中的所有文件。然后,我使用此项填充用于从项目项打包的文件。这是msdeploy实际用于添加额外文件的项。还要注意,我声明了元数据destinationrelativepath值。这将确定它将被放置在包中的相对路径。我在这里使用了语句extra files%(recursivedir)%(filename)%(extension)。这意味着要将它放在包中的同一相对位置,就像放在"额外文件"文件夹下一样。

排除文件

如果打开一个使用vs 2010创建的Web应用程序的项目文件,在其底部,您会发现一行。

2

顺便说一下,您可以在vs.中打开项目文件。右键单击项目pick unload项目。然后右键单击卸载的项目并选择"编辑项目"。

这个声明将包括我们需要的所有目标和任务。我们的大多数定制应该在导入之后,如果您不确定是否在导入之后!因此,如果您有要排除的文件,那么可以使用项目名称excludefrompackagefiles来进行排除。例如,假设您的Web应用程序中包含名为sample.debug.js的文件,但您希望从创建的包中排除该文件。您可以将下面的代码段放在导入语句之后。

1
2
3
4
5
<ItemGroup>
  <ExcludeFromPackageFiles Include="Sample.Debug.xml">
    <FromTarget>Project</FromTarget>
  </ExcludeFromPackageFiles>
</ItemGroup>

通过声明填充此项,将自动排除文件。请注意此处fromTarget元数据的用法。我不会在这里讨论这个问题,但你应该知道要经常详细说明。


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

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

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

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

  • 这暂时解决了我的问题,但如果有更好的解决方案,请告诉我,因为这不是理想的,因为涉及黑客,但再次说明,这可能是一个不寻常的部署场景?


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


    我知道这是个古老的问题,但这些问题对我都不起作用。

    在2017年,我刚刚右键点击了要发布的额外文件夹,然后选择"发布成功"。

    例子:

    enter image description here


    我知道这是一个古老的对话,但我是在尝试做同样的事情时遇到的,我认为这将有助于添加我在这里发现的内容。

    几乎所有关于在您的出版物中包含额外文件的文章都使用这种方法将CopyAllFilesToSingleFolderForPackageDependsOnCopyAllFilesToSingleFolderForMSDeployDependsOn项添加到PropertyGroup中,它们都类似于"我在文件末尾添加了这个…"

    这就是我所做的,花了一个下午的时间试图找出为什么在我意识到文件顶部已经有一个PropertyGroup部分之前什么都没有发生。当我把我的CopyAllFilesToSingleFolderForPackageDependsOn放进那部分时,它工作得很好。

    希望有朝一日能节省一些时间


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

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

    使用的是Visual Studio 2015专业版