始终使用Destination上的WebDeploy删除Angular dist文件夹内容

cvo*_*cvo 6 msbuild asp.net-mvc webdeploy microsoft-web-deploy angular

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

这在本地开发机器上运行良好,但所有dist文件都随机分配了不同的名称,例如:

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

当我们使用Web发布部署到登台或生产时,一切都很好地传输,并且发布配置文件中的自定义文件夹被包含和发布.

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

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

  • 选择发布配置文件,单击"发布"
  • 输入我的凭据
  • 应用程序构建成功
  • 如果app已成功构建,我们将删除目标服务器上的"Project\dist"文件夹.例如,"Project"可以在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>
Run Code Online (Sandbox Code Playgroud)

我已经尝试了几个已接受的答案解决方案,但无法使其工作:

有任何想法吗?除了在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>
Run Code Online (Sandbox Code Playgroud)

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

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

这里描述的msdeploy"同步"功能正是我们需要做的,但我不知道如何勾选到这个:https: //docs.microsoft.com/en-us/previous-versions/windows/it-亲/ Windows的服务器-2008-R2-和-2008/dd569034(v = ws.10)#sync

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

Use*_*ame 3

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

<DeleteExistingFiles>True</DeleteExistingFiles>
Run Code Online (Sandbox Code Playgroud)

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


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

据我所知,此属性的结果是删除所有文件。对于指定要删除的目录,您可以尝试 verb deletefrom 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.                                                                     
 */
Run Code Online (Sandbox Code Playgroud)

此示例显示删除本地计算机上的文件。您应该自定义自己的呼叫。


执行任务| 如何在发布 ClickOnce 项目时创建 Web 部署包(使用目标的一些片段)