代码之家  ›  专栏  ›  技术社区  ›  Rei Miyasaka

使MSDeploy(Visual Studio)不删除App_数据文件夹,而是删除其他所有内容

  •  55
  • Rei Miyasaka  · 技术社区  · 14 年前

    我在用Visual Studio的 Publish 按钮以部署我的网站,并希望服务器上有其他的应用程序数据文件夹。有一个复选框 Leave extra files on destination (do not delete) 这会阻止我的App_数据文件夹被删除,但随着网站的变化,它最终会积累大量残留文件。

    有什么方法可以让它在删除所有内容时仅排除App_数据吗?

    7 回复  |  直到 14 年前
        1
  •  93
  •   Community CDub    8 年前

    可以在手动调用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_数据中的所有文件和所有子文件夹(及其所有内容),但不会阻止添加和更新。

    另一个有用的地方是跳过规则可以在项目文件中定义( .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>
    

    (名字 AddCustomSkipRules SkipDeleteAppData 完全武断; $(_Escaped_PackageTempDir) 应该是 可能地 需要,但在实践中,我总是看到它的计算结果为空字符串)

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

    一个警告:这只会将这些规则添加到 .deploy.cmd命令 脚本,因此如果您想使用图形化I is管理器进行包部署,那么它是无用的,因为它不使用该脚本(从VS进行部署可能也是如此,但我还没有检查)。

        2
  •  1
  •   Bob Vale    13 年前

    您是否在项目设置中查看了包/发布网站,因为您可以告诉它在App_Data文件夹中排除文件。

        3
  •  1
  •   lef    6 年前

    在Powershell中,如果要使用msdeploy.exe或myproj.deploy.cmd( Deploying Web Packages )在使用Web Deploy包发布时生成,以便跳过删除应用程序数据文件夹并避免

    All arguments must begin with "-"
    

    错误,必须将skip指令括在三个引号中,例如:

    myproj.deploy.cmd /y /u:myusername /p:mypass """-skip:Directory=\\App_Data"""
    
        4
  •  0
  •   uniquelau    7 年前

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

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

    • 在目标位置删除其他文件
    • 从应用程序数据文件夹中排除文件

    选中“在目标位置删除其他文件”时,它将比较正在部署的文件和文件夹与服务器上的文件和文件夹。

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

    Web Publishing Profile

        5
  •  0
  •   Brett Lalonde    6 年前

    这是不理想的,因为你可能会复制很多文件这样做(我没有),但这是我的解决方案备份一个文件夹。适于在发布过程中将文件夹移动到将要发布的位置。把这个放到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>
    
        6
  •  0
  •   Guido Neele    6 年前

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

        7
  •  -1
  •   pipll    6 年前

    把这个放到pubxml文件中:

    <ExcludeApp_Data>True</ExcludeApp_Data>