Всегда удаляйте содержимое папки 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>
Я уже пробовал несколько принятых решений для ответов и не могу получить это работа:
- https://stackoverflow.com/a/45538847/559988 (я пробовал это в csproj и в файле pubxml профиля публикации.)
- https://stackoverflow.com/a/5080942/559988
какие идеи? У меня практически нет знаний о веб-развертывании, кроме настройки его в 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:"ContentPath=D:\TestDir\Test.txt""/>
/* 
 * $(MSDeploy) is path to MSDeploy binary that you passed to script.                                                                     
 */
в этом примере показано удаление файла на локальном компьютере. Вы должны настроить собственный вызов.
Exec Task | как создать пакет веб-развертывания при публикации проекта ClickOnce (некоторые фрагменты для использования мишени)
попробуйте установить это в профиле публикации
 <SkipExtraFilesOnServer>False</SkipExtraFilesOnServer>
в angular с nodejs мы будем обрабатывать эту проблему с помощью 'ng build --output-hashing=false'. Возможно, вы можете искать в этой области.
