手动调用 msdeploy 即可完成 - 只需添加以下参数:
-skip:Directory=\\App_Data
见Web Deploy Operation Settings。路径是正则表达式,所以比较灵活。
如果您使用 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\\.*'
这会跳过删除 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>
(名称 AddCustomSkipRules 和 SkipDeleteAppData 完全是任意的;$(_Escaped_PackageTempDir) 应该是可能需要的,但实际上我总是看到它评估为空字符串)
请参阅Web Deploy: Customizing a deployment package 和How to set MSDeploy settings in .csproj file 了解更多信息。
一个警告:这只会将这些规则添加到.deploy.cmd 脚本中,因此如果您想使用图形 IIS 管理器进行包部署,它是无用的,因为它不使用该脚本(部署可能也是如此)来自VS,但我没有检查)。