首页 文章

如何让Visual Studio 'Publish'功能包含后期构建事件中的文件?

提问于
浏览
84

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

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

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

6 回答

  • 0

    Adding the bin folder (and it's contents) to the project 导致文件被复制到发布输出目录 .

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

    这是使用Visual Studio 2015 Professional

  • 4

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

    几乎所有关于在您的出版物中包含额外文件的文章都使用这种方法在 PropertyGroup 中添加 CopyAllFilesToSingleFolderForPackageDependsOnCopyAllFilesToSingleFolderForMSDeployDependsOn 项目,它们都像"I added this to the end of the file ..."一样

    这就是我所做的,并花了一个下午试图找到为什么没有发生任何事情,直到我意识到文件顶部已经有一个 PropertyGroup 部分 . 当我将 CopyAllFilesToSingleFolderForPackageDependsOn 放入该部分时,它工作正常 .

    希望有一天能节省一些时间

  • 80

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

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


    From: How do you include additional files using VS2010 web deployment packages?


    好问题 . 我刚刚在Web Deployment Tool (MSDeploy) : Build Package including extra files or excluding specific files发布了一篇非常详细的博客文章 .

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

    Including Extra 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文件夹下相同的相对位置 .

    Excluding 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元数据 . 我不会在这里讨论,但你应该知道总是指明这一点 .

  • 0

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

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

    • 编辑"Package/Publish Web"项目设置和
      选择要部署的项目为"All files in this project folder"

    • 卸载项目

    • 右键单击卸载的项目,然后选择编辑项目配置

    • 找到 PropertyGroup 元素与配置设置相关联,例如"Release"

    • PropertyGroup 元素中添加以下元素并排除包中不需要的文件和文件夹

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

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

  • 12

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

  • 1

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

    在2017年VS我只是右键单击要发布的额外文件夹,然后选择发布它 .

    Example:

    enter image description here

相关问题