[英]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>
(名稱AddCustomSkipRules
和SkipDeleteAppData
完全是任意的;應該可能需要$(_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文件夾中的文件。
這不是理想的,因為你可能會復制很多文件(我不是),但這是我備份文件夾的解決方案。 適用於在發布過程中將文件夾移動到發布文件夾的位置。 把它放在你的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>
替換為根文件夾
把它放在你的pubxml文件中:
<ExcludeApp_Data>True</ExcludeApp_Data>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.