【问题标题】:Prevent MSDeploy (selectively) from deleting folders on target IIS server防止 MSDeploy(有选择地)删除目标 IIS 服务器上的文件夹
【发布时间】:2013-03-25 04:53:57
【问题描述】:

我有一个 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”更精细的东西吗?或者这是一个全有或全无的交易?

【问题讨论】:

    标签: msbuild teamcity msdeploy


    【解决方案1】:

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

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

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

    现在我可以随心所欲地发布到任一位置,并且一个不会尝试删除另一个,因为一个不再是另一个的文件系统子文件夹。

    如果有的话 - 这突出了我们早期的文件夹结构是多么原始,以及我没有意识到这是多么愚蠢。

    【讨论】:

    • 太棒了,没想到这个。
    【解决方案2】:

    我不太确定您在这里寻找什么。您是否尝试从 dotnet 子文件夹中删除所有文件但保留该文件夹?您是否试图让删除操作永远不会从 dotnet 文件夹中删除任何内容? msdeploy 同步操作非常聪明。 msdeploy 将移动所有标记的项目资产,因此假设您不删除 dotnet 文件夹中的文件,那么您应该没问题。

    如果您只是想免除 dotnet 文件夹的任何删除操作,就好像它根本不属于您的项目,但它位于 Web 服务器的子文件夹中并且您不想触摸它,那么我建议在带通配符的 msdeploy 中使用 skip 选项。我只将它用于文件,但它也适用于文件夹。是这样的:

     -skip:objectName=filePath,absolutePath=app_offline\.*
    

    这里有文档:http://technet.microsoft.com/en-us/library/dd569089%28WS.10%29.aspx

    搜索页面 -skip:skipAction=

    【讨论】:

    • 谢谢 Dan - 我有两个独立的 MSBuild 操作。一个针对根文件夹,一个针对子文件夹。我不希望以根文件夹为目标的人删除 DotNet 子文件夹或其内容。 -skip 选项看起来不错,但我正在使用带有 MSDeployPublish 目标的 MSBuild,因此希望能够从 MSBuild 命令行执行此操作。
    • 你能给我发一份你的 msbuild 命令的样本吗?我以前没有使用过 MsDeployPublish,但我有一个理论,即您应该能够将 MsDeploy 参数粘贴在命令的末尾,并且应该使用它们。 MS 将 MsBuild 和 MsDeploy 链接在一起没有让您能够在命令中调整 MsDeploy 的能力没有多大意义。这个页面看起来有点奇怪,但看起来他们正在尝试做类似的事情:pastebin.com/qyKUBMqE
    • 这里是另一个帖子的链接,我有相同的理论并显示我的 MSBuild 命令:stackoverflow.com/questions/15562817/…
    【解决方案3】:

    您还可以添加一个 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"
    

    [我以this question的答案为例。]

    【讨论】:

    • 此选项仅对 msdeploy 有效,对问题中所述的 msbuild /t:MsDeployPublish 无效。
    • @AlexWeitzer,我没有看到问题中提到“msbuild /t:MsDeployPublish”;它确实包括“我想允许 MSDeploy 删除不必要的文件......”。 MSBuild 可以调用 MSDeploy。
    猜你喜欢
    • 1970-01-01
    • 2023-02-08
    • 2011-03-20
    • 2016-03-22
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 2023-01-28
    相关资源
    最近更新 更多