57

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

有没有办法让它在删除所有内容时仅排除 App_Data ?

4

7 回答 7

101

它可以在您手动调用 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 部署可能也是如此,但我没有'未检查)。

于 2011-04-14T06:24:11.650 回答
2

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

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

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

当检查“删除目标上的其他文件”时,它将在您部署的文件和文件夹与服务器上的文件夹之间进行比较。

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

网络发布配置文件

于 2018-02-07T13:22:06.390 回答
2

在 Powershell 中,如果您想使用使用 Web 部署包发布时生成的 msdeploy.exe 或 myproj.deploy.cmd(部署 Web 包),以跳过删除 App_Data 文件夹并避免

All arguments must begin with "-"

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

myproj.deploy.cmd /y /u:myusername /p:mypass """-skip:Directory=\\App_Data"""
于 2018-11-25T15:33:20.497 回答
1

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

于 2011-10-20T18:06:12.630 回答
1

对于 csproj 中使用的 asp.net 核心 Web 应用程序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

于 2018-10-26T11:46:23.287 回答
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>

如果您只想执行任意数量的特定已知文件,请为每个文件执行一个 Copy 块:

<Target Name="PreserveSelectedFiles" AfterTargets="GatherAllFilesToPublish"  >
    <Copy SourceFiles="$(publishUrl)\MYFILENAME.EXT" 
      DestinationFolder="$(ProjectDir)\obj\$(Configuration)\Package\PackageTmp\" 
      Condition="Exists('$(publishUrl)\MYFILENAME.EXT')"></Copy>
</Target>
于 2018-08-29T19:46:10.017 回答
0

把它放在你的 pubxml 文件中:

<ExcludeApp_Data>True</ExcludeApp_Data>
于 2018-09-26T04:42:34.197 回答