当您手动调用 msdeploy 时可以完成此操作 - 只需添加以下参数:
-skip:Directory=\\App_Data
See Web部署操作设置 http://technet.microsoft.com/en-us/library/dd569089%28WS.10%29.aspx。路径是正则表达式,所以相当灵活。
如果使用 VS 生成的 ProjectName.deploy.cmd 脚本进行部署,还可以在 _MsDeployAdditionalFlags 环境变量中传递此参数(运行该脚本时)。
这是我针对我们的需求提出的最好的方案(我们的情况与您类似)。我还没有尝试将它与 VS 的“发布”按钮集成,因为我们是从命令行部署的。
EDIT:
自从我发布这个答案以来,我已经了解了一些关于 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
file:
<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
and SkipDeleteAppData
完全是任意的;$(_Escaped_PackageTempDir)
应该是possibly需要,但在实践中我总是看到它评估为空字符串)
See Web 部署:自定义部署包 http://blog.alanta.nl/2011/02/web-deploy-customizing-deployment.html and 如何在 .csproj 文件中设置 MSDeploy 设置 https://stackoverflow.com/questions/7100751/how-to-set-msdeploy-settings-in-csproj-file了解更多信息。
一个警告:这只会将这些规则添加到.deploy.cmd
脚本,因此如果您想使用图形 IIS 管理器进行包部署,它是没有用的,因为它不使用该脚本(从 VS 进行部署可能也是如此,但我没有检查)。