我们在Angular 5上有一个带有ASP.NET后端的单页应用程序,当我们编译它时,Angular的发布内容将输出到一个文件夹" Project \ dist"。
这在本地开发机器上很有用,但是所有的dist文件都是随机分配的,例如:
当我们使用Web Publishing部署到登台或制作时,所有内容都会很好地传输,并且发布配置文件中的自定义文件夹也会被包含并发布。
但是,在目标服务器(暂存或生产)上,这些旧的,随机命名的文件和旧的(不再使用的)文件夹仍然存在。这会导致数百个旧文件(来自旧网站)已经积累在登台和生产服务器上的部署)。我需要一种方法来在每次使用webdeploy推送更新时自动删除它们。
理想情况下,工作流程为:
这是我们当前发布资料的编辑版本:
<?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不必具有相同的名称。如果是的名字 目标文件夹与源的名称不同 目标文件夹将保持不变,但内容 文件夹将更新为源文件夹。
答案 0 :(得分:3)
如果我理解正确,那么在发布配置文件中解决此问题是帮助DeleteExistingFiles
属性。
<DeleteExistingFiles>True</DeleteExistingFiles>
如果设置为 True ,将清除输出目录( publishUrl ) 在输出写入之前,最好从干净开始 石板。
如何将其应用于特定文件夹,例如。只删除 “Project \ dist”文件夹?
据我所知,此属性的结果是删除所有文件。要指定要删除的目录,可以尝试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 | 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;”处理此问题。也许你可以在这个范围内搜索。