使MSDeploy(Visual Studio)不删除App_Data文件夹,但删除一切

我正在使用Visual Studio的“ Publishbutton来部署我的网站,并且需要在服务器上有不同的App_Data文件夹。 有一个checkboxLeave extra files on destination (do not delete) ,这样可以防止我的App_Data文件夹被删除,但随着网站更改,最终会累积大量的残留文件。

删除所有内容时,是否有任何方法可以排除App_Data?

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

 -skip:Directory=\\App_Data 

请参阅Web部署操作设置 。 path是一个正则expression式,所以它非常灵活。

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

这是我为我们的需求而提出的最好的(我们和你有类似的情况)。 我没有试过把它与VS的Publishbutton集成,因为我们从命令行部署。

编辑:

自从我发布这个答案以来,我已经了解了一些关于MSDeploy的内容,所以我想现在就更新它。

首先,上面的跳过规则跳过匹配path(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> 

(名称AddCustomSkipRulesSkipDeleteAppData完全是任意的; $(_Escaped_PackageTempDir)应该是可能需要的,但实际上我总是看到它评估为一个空string)

请参阅Web部署:自定义部署包以及如何在.csproj文件中设置MSDeploy设置以获取更多信息。

一个告诫:这只会将这些规则添加到.deploy.cmd脚本中,所以如果您想要使用graphics化的IISpipe理器进行包部署,那么它就没有用处,因为它不使用该脚本(从VS部署也是如此,但我没有检查)。

您是否在项目设置中查看了Package / Publish Web,因为您可以告诉它将App_Data文件夹中的文件排除在外。