簡體   English   中英

使MSDeploy(Visual Studio)不刪除App_Data文件夾,但刪除其他所有內容

[英]Make MSDeploy (Visual Studio) not delete App_Data folder but delete everything else

我正在使用Visual Studio的“ Publish按鈕來部署我的網站,並希望在服務器上使用不同的App_Data文件夾。 有一個復選框,用於Leave extra files on destination (do not delete) ,這會阻止我的App_Data文件夾被刪除,但隨后它會在網站更改時積累大量的遺留文件。

有沒有辦法讓它在刪除所有東西時只排除App_Data?

可以在手動調用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文件中包含以下內容, 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部署可能也是如此) ,但我沒有檢查過)。

從Powershell,如果要使用msdeploy.exe或使用Web Deploy Package發布時生成的myproj.deploy.cmd( 部署Web包 ),為了跳過刪除App_Data文件夾並避免

All arguments must begin with "-"

錯誤,您必須將skip指令括在三引號中,例如:

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

您是否在項目設置中查看了Package / Publish Web,因為您可以告訴它排除App_Data文件夾中的文件。

根據我的經驗, MsDeploySkipRules僅在從命令行部署時運行。

如果要從Visual Studio發布到Azure(或使用其他Web Deploy方法),則可以在發布時設置以下內容。

  • 刪除目的地的其他文件
  • 從App_Data文件夾中排除文件

當選中“刪除目的地中的其他文件”時,它將在您正在部署的文件和文件夾與服務器上的文件和文件夾之間進行比較。

請注意,如果您有用戶生成的內容,例如上傳,則可能會遇到問題。 但這可以通過將這些文件夾存儲在不同的位置來解決,例如S3 / Azure存儲。

Web發布配置文件

這不是理想的,因為你可能會復制很多文件(我不是),但這是我備份文件夾的解決方案。 適用於在發布過程中將文件夾移動到發布文件夾的位置。 把它放在你的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>

對於asp.net核心Web應用程序, MsDeploySkipRules在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

把它放在你的pubxml文件中:

<ExcludeApp_Data>True</ExcludeApp_Data>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM