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

Msbuild 防止MSDeploy(有选择地)删除目标IIS服务器上的文件夹,msbuild,teamcity,msdeploy,Msbuild,Teamcity,Msdeploy,我有一个IIS web应用程序,其结构大致类似于: wwww.mysite.com file1.asp file2.asp \DotNet file3.aspx file3.aspx 我们正在建立TeamCity来进行自动部署。我有一个部署到\DotNet文件夹(aspx文件)的MSBuild生成步骤,在单独的生成配置中,我有另一个部署到根目录(asp文件)的MSBuild生成步骤 我希望允许MSDeploy删除不必要的文件,例如,如果我从VCS中删除file2.a

我有一个IIS web应用程序,其结构大致类似于:

wwww.mysite.com
  file1.asp
  file2.asp
  \DotNet
    file3.aspx
    file3.aspx
我们正在建立TeamCity来进行自动部署。我有一个部署到\DotNet文件夹(aspx文件)的MSBuild生成步骤,在单独的生成配置中,我有另一个部署到根目录(asp文件)的MSBuild生成步骤

我希望允许MSDeploy删除不必要的文件,例如,如果我从VCS中删除file2.asp,我希望它从目标IIS服务器中删除它

但是,我不希望它擦除\DotNet子文件夹


我可以得到比命令行开关“SkipExtraFilesOnServer”更细粒度的东西吗?或者这是一个全有或全无的交易吗?

我不太确定您在这里想要什么。您是否试图删除dotnet子文件夹中的所有文件,但保留该文件夹?您是否试图让删除操作从不删除dotnet文件夹中的任何内容?msdeploy同步操作非常智能。msdeploy将移动所有已标记的项目资产,因此假设您不删除dotnet文件夹中的文件,那么您就可以了

如果您只是想免除dotnet文件夹的任何删除操作,就好像它根本不是项目的一部分,而是在web服务器的子文件夹中,并且您不想触碰它一样,那么我建议使用msdeploy中带有通配符的skip选项。我只对文件使用过它,但对文件夹也应该有用。事情是这样的:

 -skip:objectName=filePath,absolutePath=app_offline\.*
这里有文档:

在页面中搜索
-skip:skipAction=

事实证明,我问题的答案比我预期的要简单得多

默认情况下,通过MSBuild使用MSDeployPublish目标部署到应用程序的根文件夹时,会删除目标IIS服务器的文件系统上的额外子文件夹

为了避免这种情况,我只需将DotNet文件夹的内容移动到C:\InetPub下的一个完全独立的位置,但在IIS Mgr下保留了我原来的虚拟文件夹/应用程序结构。当然

现在我可以任意发布到任何一个位置,其中一个不会尝试删除另一个,因为其中一个不再是另一个的文件系统子文件夹

如果有的话-这突出显示了我们早期的文件夹结构是多么原始,我没有意识到这是多么糟糕。

您还可以添加一个设置,其中包含您希望不同步的文件夹的名称,如下面的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"

[我从对的回答中选取了示例。]

谢谢Dan-我有两个单独的MSBuild操作。一个目标是根文件夹,一个目标是子文件夹。我不希望以根文件夹为目标的文件夹删除DotNet子文件夹或其内容。该-skip选项看起来不错,但我正在将MSBuild与MSDeployPublish目标一起使用,因此希望能够从MSBuild命令行执行此操作。能否向我发送MSBuild命令的示例?我以前没有使用过MsDeployPublish,但我有一个理论,即您应该能够将MsDeploy参数粘贴到命令的末尾,并且它应该接受这些参数。如果MS不允许您在命令中调整MsDeploy,那么将MsBuild和MsDeploy链接在一起就没有多大意义。这个页面看起来有点奇怪,但看起来他们试图做类似的事情:这里有一个链接,指向我用相同的理论写的另一篇文章,并使用我的MSBuild命令:这个选项只对msdeploy有效,不适用于问题中描述的MSBuild/t:MsDeployPublish。@AlexWeitzer,我没有看到任何关于问题中的“msbuild/t:MsDeployPublish”;它确实包括“我想允许MSDeploy删除不必要的文件…”。msbuild可以调用MSDeploy.Brilliant,但我甚至没有想到这一点。