Всегда удаляйте содержимое папки Angular dist с помощью WebDeploy по назначению

У нас есть одностраничное приложение на Angular 5 с ASP.NET бэкэнд, и когда мы его компилируем, содержимое выпуска для Angular выводится в папку "Projectdist".

это отлично работает на локальных компьютерах dev, но все файлы dist рандомизированы с разными именами, такими как:

  • polyfills.dc7175a7225af84b3c9b.пакет.js
  • стили.dc7175a7225af84b3c9b.пакет.js
  • inline.dc7175a7225af84b3c9b.пакет.js

когда мы используем веб-публикацию для развертывания на этапе или производстве, все переносится отлично, и наша пользовательская папка в профилях публикации включена и опубликована.

однако на целевом сервере (промежуточном или производственном) эти старые, случайно названные файлы и старые (нет дольше используется) папки сохраняются. это приводит к сотням и сотням старых файлов (из старых веб-развертываний), которые накопились на промежуточных и производственных серверах. Мне нужен метод автоматического удаления их каждый раз, когда мы нажимаем обновления с помощью webdeploy.

в идеале рабочий процесс:

  • выберите профиль публикации Нажмите кнопку "Опубликовать"
  • введите мои учетные данные
  • приложение строит успешно
  • если приложение построено успешно, идем удалять папку "Projectdist" на целевом сервере. "Проект" может быть в c:inetpubwwwproject или d:websitesProject например.
  • обновленные файлы копируются
  • Web deploy выполняет и копирует пользовательские файлы в папку 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="..Projectdist***" />

      <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.

лучшие, Крис!--3-->

редактировать я также пробовал это: (на основе этого: 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

первый комментарий оттуда-та же проблема, которую мы испытываем: Это очень удобно при развертывании файлов углового распределения с бэкхенда ASP.NET всякий раз, когда оба SPA и бэкэнд разделяют то же самое одно виртуальное приложение. К сожалению, из-за кэша браузера методы перебора, файлы пакета для углового развертывания будут всегда грузите с уникальными именами и, следовательно, msbuild команда / атрибут или другая возможность для того чтобы обтереть папку чистой на Сторона IIS перед отправкой обновленных файлов будет очень приветствоваться. Если кто-нибудь нашел способ сделать это, пожалуйста, поделитесь.

функциональность "синхронизации", описанная здесь для 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 ответов


если я понял вас правильно, то решить эту проблему поможетDeleteExistingFiles свойство в профиле публикации.

<DeleteExistingFiles>True</DeleteExistingFiles>

, если значение правда выходной каталог (publishUrl) будет продуваться прежде чем вывод записывается в него, хорошо начать с чистого шифер.


как я могу применить это к определенной папке, например. только удалить Папка "Project\dist"?

As Я знаю, что результатом этого свойства является удаление всех файлов. Для указания каталогов для удаления вы можете попробовать verb 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 | как создать пакет веб-развертывания при публикации проекта ClickOnce (некоторые фрагменты для использования мишени)


попробуйте установить это в профиле публикации

 <SkipExtraFilesOnServer>False</SkipExtraFilesOnServer>

в angular с nodejs мы будем обрабатывать эту проблему с помощью 'ng build --output-hashing=false'. Возможно, вы можете искать в этой области.