asp.net - 使 MSDeploy (Visual Studio) 不删除 App_Data 文件夹,而是删除其他所有内容

标签 asp.net iis deployment msdeploy

我正在使用 Visual Studio 的Publish 按钮来部署我的网站,并希望在服务器上有一个不同的 App_Data 文件夹。有一个在目标上保留额外文件(不删除) 的复选框,它可以防止我的 App_Data 文件夹被删除,但随着网站的更改,它最终会积累大量残留文件。

有什么办法让它在删除所有内容时只排除 App_Data 吗?

最佳答案

当您手动调用 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>

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

参见Web Deploy: Customizing a deployment package How to set MSDeploy settings in .csproj file了解更多信息。

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

关于asp.net - 使 MSDeploy (Visual Studio) 不删除 App_Data 文件夹,而是删除其他所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4289440/

相关文章:

javascript - ASP.net OnClientClick 有一个异步调用 - 如何仅在异步调用完成并成功时才继续进行服务器端 OnClick?

asp.net - 是否可以在运行时更改 ASP.NET Web.Config 值而不重新加载应用程序域?

.net - 如何以编程方式获取 ASP.NET 临时目录?

qt - 如何部署使用ODBC插件的QT应用程序(无静态链接)?

deployment - 无法识别 Catalyst 应用程序 info.plist

asp.net - 如何在IIS 7.5中配置应用程序池在停止时自动重新启动?

c# - 如何在 jQuery 中显示按钮单击事件的确认消息?

MVC 应用程序中的 asp.net 3.5 密码恢复控制?

javascript - 如何更改 IIS 默认网站的 angularJS 指令

java - 使用java移动文件有哪些方法?