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

bro*_*die 87 asp.net build-process publishing visual-studio-2010 msdeploy

我目前正在尝试使用Visual Studio 2010"发布"和MSDeploy的功能来处理我的网络部署需求,但有关于定制取决于我的构建配置包碰到路障.

我开发一个32位的环境中,但需要对64位环境中创建一个发布包,因此在"释放"的配置我有一个后生成事件那份第三方的64位版本的DLL注入的bin目录覆盖32位版本.当我使用"发布"功能,即使正确的64位DLL被复制到bin目录下,它不会包括在包中.

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

Say*_*imi 89

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

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


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


好问题.我刚刚在Web部署工具(MSDeploy)上发布了一篇非常详细的博客文章:包括额外文件或排除特定文件的构建包.

这是概要.包含文件后,我将展示如何排除文件.

包括额外文件

如果您对MSBuild感到满意,那么将额外的文件包含在包中会有点困难,但仍然没有bigee,如果您不熟悉,那么请阅读此内容.为了做到这一点,我们需要挂钩收集文件以进行打包的过程部分.我们需要扩展的目标称为CopyAllFilesToSingleFolder.这个目标有一个依赖属性,PipelinePreDeployCopyAllFilesToOneFolderDependsOn,我们可以利用它来注入我们自己的目标.因此,我们将创建一个名为CustomCollectFiles的目标,并将其注入到流程中.我们通过以下方式实现此目的(请记住import语句之后).

<PropertyGroup>
  <CopyAllFilesToSingleFolderForPackageDependsOn>
    CustomCollectFiles;
    $(CopyAllFilesToSingleFolderForPackageDependsOn);
  </CopyAllFilesToSingleFolderForPackageDependsOn>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

这会将我们的目标添加到流程中,现在我们需要定义目标本身.假设您有一个名为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>
Run Code Online (Sandbox Code Playgroud)

这里我所做的是创建项目_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" />
Run Code Online (Sandbox Code Playgroud)

顺便说一句,你可以在VS里面打开项目文件.右键单击项目选择卸载项目.然后右键单击卸载的项目并选择"编辑项目".

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

<ItemGroup>
  <ExcludeFromPackageFiles Include="Sample.Debug.xml">
    <FromTarget>Project</FromTarget>
  </ExcludeFromPackageFiles>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

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

  • @Sayed,这似乎不适用于VS2012,你知道如何为这个场景更新它.更改为v11.0不起作用.TIA. (8认同)
  • 几乎没有任何关于这些东西的文档。Microsoft 文档引用了您的博客。 (2认同)
  • @Daniel如果您只需要特定文件而不是文件夹,只需更改_CustomFiles以包含这些特定文件,而不是使用\**\*递归添加.所以像<_CustomFiles Include ="..\Dependencies\FileA.dll"/> <_ CustomFiles Include ="C:\ Someotherplace\FileB.txt"/>类似的东西. (2认同)
  • @SimonFrancesco我也经历过这个,并且必要的改变似乎是扩展<Cop​​yAllFilesToSingleFolderForMsdeployDependsOn>而不是上面回答中所写的<CopyAllFilesToSingleFolderForPackageDependsOn>. (2认同)
  • https://www.asp.net/mvc/overview/deployment/visual-studio-web-deployment/deploying-extra-files (2认同)

bro*_*die 13

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

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

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

    <ExcludeFilesFromDeployment>*.cs;**\.svn\**\*.*;Web.*.config;*.csproj*</ExcludeFilesFromDeployment>
    <ExcludeFoldersFromDeployment>.svn;Controllers;BootstrapperTasks;Properties</ExcludeFoldersFromDeployment>
    
    Run Code Online (Sandbox Code Playgroud)
  6. 保存并重新加载项目

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


Gom*_*mes 5

选择文件或文件夹,然后从“属性”窗口中将“生成”操作更改为“内容”。

  • 文件夹不存在构建操作(VS2013) (7认同)