Всегда удаляйте содержимое папки 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'. Возможно, вы можете искать в этой области.