始终使用目标

时间:2018-04-10 16:35:36

标签: asp.net-mvc angular msbuild webdeploy microsoft-web-deploy

我们在Angular 5上有一个带有ASP.NET后端的单页应用程序,当我们编译它时,Angular的发布内容将输出到一个文件夹" Project \ dist"。

这在本地开发机器上很有用,但是所有的dist文件都是随机分配的,例如:

  • polyfills.dc7175a7225af84b3c9b.bundle.js
  • styles.dc7175a7225af84b3c9b.bundle.js
  • inline.dc7175a7225af84b3c9b.bundle.js

当我们使用Web Publishing部署到登台或制作时,所有内容都会很好地传输,并且发布配置文件中的自定义文件夹也会被包含并发布。

但是,在目标服务器(暂存或生产)上,这些旧的,随机命名的文件和旧的(不再使用的)文件夹仍然存在。这会导致数百个旧文件(来自旧网站)已经积累在登台和生产服务器上的部署)。我需要一种方法来在每次使用webdeploy推送更新时自动删除它们。

理想情况下,工作流程为:

  • 选择发布配置文件,然后点击发布
  • 输入我的凭据
  • 应用程序构建成功
  • 如果app构建成功,我们会删除" Project \ dist"目标服务器上的文件夹。 "项目"可以在c:\ inetpub \ www \ project或d:\ websites \ Project中,例如。
  • 已复制更新的文件
  • Web部署执行并复制dist文件夹中的自定义文件(已经正常工作)。

这是我们当前发布资料的编辑版本:

<?xml version="1.0" encoding="utf-8"?>
<!--
This file is used by the publish/package process of your Web project. You can customize the behavior of this process
by editing this MSBuild file. In order to learn more about this please visit http://go.microsoft.com/fwlink/?LinkID=208121. 
-->
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <WebPublishMethod>MSDeploy</WebPublishMethod>
    <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
    <LastUsedPlatform>Any CPU</LastUsedPlatform>
    <SiteUrlToLaunchAfterPublish />
    <LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>
    <ExcludeApp_Data>False</ExcludeApp_Data>
    <MSDeployServiceURL>staging.example.com</MSDeployServiceURL>
    <DeployIisAppPath>Project</DeployIisAppPath>
    <RemoteSitePhysicalPath />
    <SkipExtraFilesOnServer>True</SkipExtraFilesOnServer>
    <MSDeployPublishMethod>WMSVC</MSDeployPublishMethod>
    <EnableMSDeployBackup>False</EnableMSDeployBackup>
    <UserName>WebDeployUser</UserName>
    <PublishDatabaseSettings>
      <Objects xmlns="">
      </Objects>
    </PublishDatabaseSettings>
    <ADUsesOwinOrOpenIdConnect>False</ADUsesOwinOrOpenIdConnect>
  </PropertyGroup>
  <Target Name="CustomCollectFiles">
    <ItemGroup>
      <_CustomFiles Include="..\Project\dist\**\*" />

      <FilesForPackagingFromProject  Include="%(_CustomFiles.Identity)">
        <DestinationRelativePath>dist\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
      </FilesForPackagingFromProject>
    </ItemGroup>
  </Target>
  <PropertyGroup>
    <CopyAllFilesToSingleFolderForPackageDependsOn>
      CustomCollectFiles;
      $(CopyAllFilesToSingleFolderForPackageDependsOn);
    </CopyAllFilesToSingleFolderForPackageDependsOn>

    <CopyAllFilesToSingleFolderForMsdeployDependsOn>
      CustomCollectFiles;
      $(CopyAllFilesToSingleFolderForMsdeployDependsOn);
    </CopyAllFilesToSingleFolderForMsdeployDependsOn>
  </PropertyGroup>
</Project>

我已经尝试了一些已接受的答案解决方案,但无法解决这个问题:

有什么想法吗?除了在IIS中设置之外,我基本上没有Web部署的知识。

最佳, 克里斯

编辑我也试过这个:(基于此:https://stackoverflow.com/a/15113445/559988

  <Target Name="CleanFolder">

    <PropertyGroup>
      <TargetFolder>$(_MSDeployDirPath_FullPath)\dist</TargetFolder>
    </PropertyGroup>

    <ItemGroup>
      <FilesToClean Include="$(TargetFolder)\**\*"/>
      <Directories Include="$([System.IO.Directory]::GetDirectories('$(TargetFolder)', '*', System.IO.SearchOption.AllDirectories))"
                   Exclude="$(TargetFolder)"/>
    </ItemGroup>

    <Delete Files="@(FilesToClean)" ContinueOnError="true"/>
    <RemoveDir Directories="@(Directories)" />
  </Target>

更新 这是我们正在做的事情:https://docs.microsoft.com/en-us/aspnet/web-forms/overview/deployment/visual-studio-web-deployment/deploying-extra-files

  

来自那里的第一条评论是我们遇到的同样问题:   这在部署Angular分发文件时非常方便   使用ASP.Net后端,只要SPA和后端共享相同的内容   单一虚拟应用程序不幸的是,由于浏览器缓存   破坏技术,Angular部署的捆绑文件将   总是带有唯一的名称,因此,msbuild   命令/属性或其他可能擦除文件夹清理   发送更新文件之前的IIS端将非常受欢迎。如果   任何人都找到了办法,请分享。

&#34;同步&#34;这里描述的msdeploy功能正是我们需要做的,但我不知道如何勾解这个: https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/dd569034(v=ws.10)#sync

  

在同步操作中,如果源文件或文件夹不存在   目的地,提供者创建文件夹和任何子文件夹   具有相应的文件和属性。如果是目的地   文件夹已存在,提供程序仅更新那些执行的对象   与源不匹配。这意味着在某些情况下只有一个文件或   文件夹将更新。目标上不存在的文件   源将被删除。的源和目标文件夹   contentPath不必具有相同的名称。如果是的名字   目标文件夹与源的名称不同   目标文件夹将保持不变,但内容   文件夹将更新为源文件夹。

3 个答案:

答案 0 :(得分:3)

如果我理解正确,那么在发布配置文件中解决此问题是帮助DeleteExistingFiles属性。

<DeleteExistingFiles>True</DeleteExistingFiles>
  

如果设置为 True ,将清除输出目录( publishUrl )   在输出写入之前,最好从干净开始   石板。

  

如何将其应用于特定文件夹,例如。只删除   “Project \ dist”文件夹?

据我所知,此属性的结果是删除所有文件。要指定要删除的目录,可以尝试delete中的动词MSDeploy,它可以包装在自定义脚本的<Exec>任务中:

<Exec Command="$(MSDeploy) -verb:delete -dest:&quot;ContentPath=D:\TestDir\Test.txt&quot"/>

/* 
 * $(MSDeploy) is path to MSDeploy binary that you passed to script.                                                                     
 */

此示例显示在本地计算机上删除文件。你应该自定义自己的电话。

Exec Task | How to create a Web Deploy package when publishing a ClickOnce project(使用目标的一些片段)

答案 1 :(得分:0)

请尝试在发布资料中设置此内容

 <SkipExtraFilesOnServer>False</SkipExtraFilesOnServer>

答案 2 :(得分:0)

与nodejs成角度,我们将使用“build -output-hashing = false&#39;”处理此问题。也许你可以在这个范围内搜索。