防止 MSDeploy(有选择地)从目标 IIS 服务器上删除文件夹

6

我有一个类似于以下结构的IIS Web应用程序:

wwww.mysite.com
  file1.asp
  file2.asp
  \DotNet
    file3.aspx
    file3.aspx

我们正在设置TeamCity以进行自动部署。我有一个MSBuild构建步骤,用于部署到\DotNet文件夹(aspx文件),在另一个构建配置中,我有另一个MSBuild构建步骤,用于部署到根目录(asp文件)。
我希望允许MSDeploy删除不必要的文件,例如如果我从VCS中删除file2.asp,则希望它从目标IIS服务器中删除该文件。
但是,我不希望它擦除\DotNet子文件夹。
我是否可以获得比命令行开关“SkipExtraFilesOnServer”更细粒度的控制,或者这是一项全盘接管的任务?
3个回答

6
原来我的问题的答案比我预期的要简单得多。
当使用MSBuild通过MSDeployPublish目标部署到应用程序的根文件夹时,默认情况下,目标IIS服务器上的额外子文件夹会被删除。
为了避免这种情况,我只需将我的DotNet文件夹的内容移动到C:\InetPub的完全独立位置,但在IIS Mgr下保留原始虚拟文件夹/应用程序结构。当然!
现在我可以随意发布到任何一个位置,而且它们不会试图删除彼此,因为一个不再是另一个的文件系统子文件夹了。
如果有什么不同之处,那就是这突出了我们早期文件夹结构是多么原始,以及我没有意识到这一点是多么愚蠢。

太棒了,我甚至没有想到这个。 - The Muffin Man

3
我不太确定你在这里想要什么。您是要删除dotnet子文件夹中的所有文件但保留文件夹吗?还是试图使删除操作永远不会从dotnet文件夹中删除任何内容?msdeploy同步操作非常智能。msdeploy将移动所有标记的项目资产,因此假设您不删除dotnet文件夹中的文件,那么您应该没问题。
如果您只想豁免dotnet文件夹免受任何删除操作的影响,就好像它根本不是您项目的一部分,但它位于Web服务器的子文件夹中且您不想对其进行更改,则建议使用带通配符的msdeploy跳过选项。我只用于文件,但对于文件夹也应该有效。操作如下:
 -skip:objectName=filePath,absolutePath=app_offline\.*

这里有文档:http://technet.microsoft.com/zh-cn/library/dd569089%28WS.10%29.aspx 在页面上搜索“-skip:skipAction=”

谢谢Dan - 我有两个独立的MSBuild操作。一个针对根文件夹,另一个针对子文件夹。我不希望针对根文件夹的操作删除DotNet子文件夹或其内容。那个-skip选项看起来不错,但我正在使用带有MSDeployPublish目标的MSBuild,所以希望能够从MSBuild命令行完成此操作。 - Michael12345
你能给我发一个你的msbuild命令的样例吗?我以前没有使用过MsDeployPublish,但我有一个理论,即你应该能够在命令的末尾添加MsDeploy参数,并且它应该会接受它们。MS将MsBuild和MsDeploy链接在一起,却不给你在命令中调整MsDeploy的能力,这似乎没有多大意义。这个页面看起来有点奇怪,但它看起来他们试图做类似的事情:http://pastebin.com/qyKUBMqE - Dan Csharpster
这是我之前发表的一篇帖子,其中包含相同理论并展示了我的MSBuild命令的链接:https://dev59.com/wW_Xa4cB1Zd3GeqP7PzL - Michael12345

2
您还可以添加一个skip设置,其中包含您不希望同步的文件夹名称,就像以下msdeploy调用中所示:
msdeploy
  -verb:sync 
  -source:contentPath="C:\Data\Personal\My Repo\MSDeploy\MultiSkip\Source" 
  -dest:contentPath="C:\Data\Personal\My Repo\MSDeploy\MultiSkip\Dest" 
  -skip:objectName=dirPath,absolutePath="DotNet"

我从这个问题的答案中选了一个例子。

此选项仅适用于msdeploy,而不适用于msbuild /t:MsDeployPublish,正如问题中所描述的那样。 - Alex Weitzer
2
@AlexWeitzer,我在问题中没有看到任何关于“msbuild /t:MsDeployPublish”的提及;但它确实包括了“我想允许MSDeploy删除不必要的文件...”。MSBuild可以调用MSDeploy。 - Kenny Evitt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接