使MSDeploy(Visual Studio)不删除App_Data文件夹,但删除其他所有内容

时间:2010-11-27 00:35:32

标签: asp.net iis deployment msdeploy

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

有没有办法让它在删除所有东西时只排除App_Data?

7 个答案:

答案 0 :(得分:93)

可以在手动调用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部署,但我没有检查过。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

根据我的经验,MsDeploySkipRules仅在从命令行部署时运行。

如果要从Visual Studio发布到Azure(或使用其他Web Deploy方法),则可以在发布时进行以下设置。

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

选中“删除目的地中的其他文件”时,它会对您正在部署的文件和文件夹以及服务器上的文件和文件夹进行比较。

警告,如果您有用户生成的内容,则可能会遇到问题。上传。但是,这可以通过将这些文件夹存储在不同的位置来解决,例如, S3 / Azure存储。

Web Publishing Profile

答案 3 :(得分:0)

这不是理想的选择,因为这样做可能会复制很多文件(不是),但这是我备份文件夹的解决方案。适用于在发布过程中将文件夹移动到将其发布到的位置。将其放在您的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>

答案 4 :(得分:0)

对于asp.net核心网络应用,请在csproj中使用MsDeploySkipRules

<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

答案 5 :(得分:0)

如果要使用通过Web Deploy Package发布时生成的msdeploy.exe或myproj.deploy.cmd(Deploying Web Packages),可以从Powershell中跳过跳过App_Data文件夹并避免使用

All arguments must begin with "-"

错误,您必须将skip指令用三引号引起来,例如:

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

答案 6 :(得分:-1)

将其放入您的pubxml文件中:

<ExcludeApp_Data>True</ExcludeApp_Data>