【问题标题】:Make MSDeploy (Visual Studio) not delete App_Data folder but delete everything else使 MSDeploy (Visual Studio) 不删除 App_Data 文件夹,而是删除其他所有内容
【发布时间】:2011-05-16 10:09:12
【问题描述】:

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

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

【问题讨论】:

    标签: asp.net iis deployment msdeploy


    【解决方案1】:

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

    All arguments must begin with "-"
    

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

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

    【讨论】:

      【解决方案2】:

      对于 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>
      

      &lt;dir_name&gt; 替换为您的根文件夹

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

      【讨论】:

        【解决方案3】:

        把它放在你的 pubxml 文件中:

        <ExcludeApp_Data>True</ExcludeApp_Data>
        

        【讨论】:

        • 这其实是一个选项,不知道为什么有人mark down。我标记
        【解决方案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>
        

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

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

        【讨论】:

          【解决方案5】:

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

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

          • 删除目标位置的其他文件
          • 从 App_Data 文件夹中排除文件

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

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

          【讨论】:

            【解决方案6】:

            手动调用 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,但我没有检查)。

            【讨论】:

            • 太棒了!我什至去过那个 MS 页面但没有找到它。
            • 为了在部署期间通过 Visual Studio“发布”功能工作,必须使用 AfterAddIisSettingAndFileContentsToSourceManifest 而不是 OnBeforePackageUsingManifest。见评论blog.alanta.nl/2011/02/…
            • 就我而言,这特别有用,因为我正在部署到根站点,而不是其中的应用程序,所以我需要-skip:Directory=\\aspnet_client。像魅力一样工作。
            • 在我的情况下,将 msbuild 部分添加到 .csproj 文件不起作用。另一方面,msdeploy 部分运行良好。但不幸的是,我需要 msbuild 才能工作。有没有办法调试它?为什么它不起作用?
            • “不工作”是什么意思?只是没有将这些规则添加到.deploy.cmd 脚本中,还是您遇到了一些错误?您可能希望使用/verbosity:diagnostic 运行 msbuild,它应该有助于调试问题(例如,查看是否调用了添加的目标)。您没有说您使用的是哪个 msbuild 版本 - 我在 VS2010 工具中使用此解决方案,从那时起可能有一些更改(例如,OnBeforePackageUsingManifest 不再存在,或者MsDeploySkipRules 不再存在或更改了语法)。
            【解决方案7】:

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

            【讨论】:

            • 我试过这个,但它不起作用。它仍然尝试在发布时删除文件夹
            • 嗨,当我使用 slowcheetah 时,即使我们将 exludefilesfromdeployment 放入它也不会删除文件。
            猜你喜欢
            • 1970-01-01
            • 2015-11-26
            • 2012-09-19
            • 1970-01-01
            • 2018-01-05
            • 1970-01-01
            • 1970-01-01
            • 2017-12-21
            • 1970-01-01
            相关资源
            最近更新 更多