让MSDeploy(Visual Studio中)不会删除App_Data文件夹删除,但其他一切让M

2019-05-13 08:25发布

我使用Visual Studio的Publish按钮来部署自己的网站,并希望在服务器上不同的App_Data文件夹。 有一个复选框Leave extra files on destination (do not delete)以防止我的App_Data文件夹从得到删除,但那么它最终会堆积大量的残留文件作为该网站的变化。

有没有什么办法让它只排除App_Data文件时,它会删除一切吗?

Answer 1:

它可以当你手动调用msdeploy做 - 只需添加以下参数:

-skip:Directory=\\App_Data

请参阅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\\.*'

此跳过所有文件和程序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部署:自定义部署包和如何设置.csproj的文件MSDeploy设置以获得更多信息。

警告:这只是增加了这些规则的.deploy.cmd脚本,所以如果你要使用包部署图形IIS管理器中它是无用的,因为它不使用脚本(同样可能也适用于从VS部署,但我没有检查)。



Answer 2:

你有没有看着封装/发布Web项目的设置,因为你可以告诉它在App_Data文件夹中的文件exlude。



Answer 3:

从我的经验, MsDeploySkipRules从命令行进行部署时才会运行。

如果您从Visual Studio发布到Azure的(或使用其他Web部署方法),您可以设置发布时以下。

  • 删除目的地其他文件
  • 从App_Data文件夹排除文件

当“在目标中删除其他文件”被选中,就会使文件和要部署的文件夹,并在服务器上的那些之间的比较。

被警告,你可以,如果你有用户生成内容,如上传遇到的问题。 但可能会被存储在不同的位置,例如S3 / Azure存储这些文件夹被合作周围。



Answer 4:

这不是理想的,因为你可能会复制大量的文件这样做(我不是),但这里是我的备份解决方案文件夹。 适应于文件夹移动到它会被发布的位置,在发布过程中。 把这个在您的pubxml文件:

<Project>
...
<Target Name="PreserveSelectedFolder" AfterTargets="GatherAllFilesToPublish">
   <ItemGroup>
     <SITEDIR Include="$(publishUrl)\App_Data\**\*.*" />
   </ItemGroup>
   <Copy SourceFiles="@(SITEDIR)" 
      DestinationFolder="$(ProjectDir)\obj\$(Configuration)\Package\PackageTmp\%(RecursiveDir)"></Copy>
</Target>
</Project>

如果你只想做任何数量的特定的已知文件,请每个文件的一个副本块:

<Target Name="PreserveSelectedFiles" AfterTargets="GatherAllFilesToPublish"  >
    <Copy SourceFiles="$(publishUrl)\MYFILENAME.EXT" 
      DestinationFolder="$(ProjectDir)\obj\$(Configuration)\Package\PackageTmp\" 
      Condition="Exists('$(publishUrl)\MYFILENAME.EXT')"></Copy>
</Target>


Answer 5:

对于asp.net核心的网络应用程序使用MsDeploySkipRules中的csproj。

<ItemGroup>
  <MsDeploySkipRules Include="CustomSkipFile">
    <ObjectName>filePath</ObjectName>
    <AbsolutePath><dir_name>\\app_data</AbsolutePath>
  </MsDeploySkipRules>
  <MsDeploySkipRules Include="CustomSkipFile">
    <ObjectName>dirPath</ObjectName>
    <AbsolutePath><dir_name>\\app_data</AbsolutePath>
  </MsDeploySkipRules>
</ItemGroup>

替换<dir_name>与您的根文件夹

https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/visual-studio-publish-profiles?view=aspnetcore-2.1#exclude-files



Answer 6:

从PowerShell中,如果你想使用msdeploy.exe或myproj.deploy.cmd( 部署Web包 )与Web部署包发布时,以跳过删除App_Data文件夹,避免产生

All arguments must begin with "-"

错误,则必须在其在三重引号,例如跳跃指令:

myproj.deploy.cmd /y /u:myusername /p:mypass """-skip:Directory=\\App_Data"""


Answer 7:

把这个在您的pubxml文件:

<ExcludeApp_Data>True</ExcludeApp_Data>


文章来源: Make MSDeploy (Visual Studio) not delete App_Data folder but delete everything else