使MSDeploy(Visual Studio)不删除App_Data文件夹,但删除其他所有内容

Rei*_*aka 56 asp.net deployment iis msdeploy

我正在使用Visual Studio的Publish按钮来部署我的网站,并希望服务器上有一个不同的App_Data文件夹.有一个复选框Leave extra files on destination (do not delete)可以防止我的App_Data文件夹被删除,但随后它会在网站更改时积累大量的遗留文件.

有没有办法让它在删除所有东西时只排除App_Data?

Jak*_*icz 93

可以在手动调用msdeploy时完成 - 只需添加以下参数:

-skip:Directory=\\App_Data
Run Code Online (Sandbox Code Playgroud)

请参阅Web部署操作设置.路径是正则表达式,因此非常灵活.

如果使用VS生成的ProjectName.deploy.cmd脚本进行部署,则还可以在_MsDeployAdditionalFlags环境变量中传递此参数(运行该脚本时).

这是我为我们的需求提出的最好的(我们有与你类似的情况).我没有尝试将它与VS的发布按钮集成,因为我们是从命令行部署的.

编辑:

自从我发布这个答案以来,我已经学到了一些关于MSDeploy的东西,所以我想我现在就更新它了.

首先,上述跳过规则会跳过匹配路径(App_Data)上的任何操作.如果需要更精细的控制,则可以使用更详细的语法.例如,要仅删除删除(在目标服务器上保留任何额外文件,但添加任何新文件并更新现有文件):

-skip:skipaction='Delete',objectname='filePath',absolutepath='\\App_Data\\.*' -skip:skipaction='Delete',objectname='dirPath',absolutepath='\\App_Data\\.*'
Run Code Online (Sandbox Code Playgroud)

这会删除App_Data中所有文件和所有子文件夹(及其所有内容)的删除,但不会阻止添加和更新.

另一个有用的事情是可以在项目文件(.csproj)中定义跳过规则,以便它们自动包含在.deploy.cmd与包一起生成的脚本中.这使得不必通过_MsDeployAdditionalFlags将它们传递给脚本.

如果csproj文件中包含以下内容,则将添加上述跳过规则:

<PropertyGroup>
  <OnBeforePackageUsingManifest>AddCustomSkipRules</OnBeforePackageUsingManifest>
</PropertyGroup>
<Target Name="AddCustomSkipRules">
  <ItemGroup>
    <MsDeploySkipRules Include="SkipDeleteAppData">
      <SkipAction>Delete</SkipAction>
      <ObjectName>filePath</ObjectName>
      <AbsolutePath>$(_Escaped_PackageTempDir)\\App_Data\\.*</AbsolutePath>
      <XPath>
      </XPath>
    </MsDeploySkipRules>
    <MsDeploySkipRules Include="SkipDeleteAppData">
      <SkipAction>Delete</SkipAction>
      <ObjectName>dirPath</ObjectName>
      <AbsolutePath>$(_Escaped_PackageTempDir)\\App_Data\\.*</AbsolutePath>
      <XPath>
      </XPath>
    </MsDeploySkipRules>
  </ItemGroup>
</Target>
Run Code Online (Sandbox Code Playgroud)

(名称AddCustomSkipRulesSkipDeleteAppData完全是任意的; $(_Escaped_PackageTempDir)应该可能需要,但在实践中我总是看到它评估为空字符串)

有关详细信息,请参阅Web部署:自定义部署包如何在.csproj文件中设置MSDeploy设置.

需要注意的是:这只会将这些规则添加到.deploy.cmd脚本中,因此如果您想使用图形IIS管理器进行软件包部署,它就没用了,因为它不使用该脚本(同样可能是从VS部署,但我没有没检查过.

  • 为了在部署期间通过Visual Studio"发布"功能工作,必须使用`AfterAddIisSettingAndFileContentsToSourceManifest`而不是`OnBeforePackageUsingManifest`.请参阅评论http://blog.alanta.nl/2011/02/web-deploy-customizing-deployment.html?showComment=1314013105475#c1406362862563428999 (10认同)