Visual StudioのPublish
ボタンを使用してWebサイトを展開していますが、サーバーに別のApp_Dataフォルダーが必要です。 App_Dataフォルダーが削除されないようにするLeave extra files on destination (do not delete)
のチェックボックスがありますが、Webサイトが変更されると、最終的に多くの痕跡ファイルが蓄積されます。
すべてを削除するときに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内のすべてのファイルとすべてのサブフォルダー(およびそのすべてのコンテンツ)の削除がスキップされますが、追加と更新は妨げられません。
もう1つの便利なことは、スキップ規則をプロジェクトファイル(_.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配置:配置パッケージのカスタマイズ および 。csprojファイルでMSDeploy設定を設定する方法 を参照してください。
注意点:これはこれらのルールを_.deploy.cmd
_スクリプトに追加するだけなので、グラフィカルなIIS Managerをパッケージの展開に使用する場合、それを使用しないので役に立たないスクリプト(おそらくVSからの展開でも同じですが、チェックしていません)。
Powershellから、msdeploy.exeまたはmyproj.deploy.cmd( Deploying Web Packages )を使用する場合は、App _Dataフォルダーの削除をスキップして、
All arguments must begin with "-"
エラーの場合、スキップディレクティブを三重引用符で囲む必要があります。 :
myproj.deploy.cmd /y /u:myusername /p:mypass """-skip:Directory=\\App_Data"""
App_Dataフォルダー内のファイルを除外するように指示できるため、プロジェクト設定でPackage/Publish 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>
特定の既知のファイルをいくつでも実行したい場合は、ファイルごとに1つのコピーブロックを実行します。
<Target Name="PreserveSelectedFiles" AfterTargets="GatherAllFilesToPublish" >
<Copy SourceFiles="$(publishUrl)\MYFILENAME.EXT"
DestinationFolder="$(ProjectDir)\obj\$(Configuration)\Package\PackageTmp\"
Condition="Exists('$(publishUrl)\MYFILENAME.EXT')"></Copy>
</Target>
私の経験では、MsDeploySkipRules
はコマンドラインからデプロイする場合にのみ実行されます。
Visual StudioからAzureに発行する場合(または別のWeb配置メソッドを使用する場合)は、発行時に以下を設定できます。
[宛先で追加のファイルを削除する]がチェックされている場合、展開しているファイルとフォルダーとサーバー上のものを比較します。
警告が表示されます。ユーザーが作成したコンテンツがある場合、問題が発生する可能性があります。アップロード。ただし、これらのフォルダを別の場所に保存することで回避できます。 S3/Azureストレージ。
これをpubxmlファイルに入れます:
<ExcludeApp_Data>True</ExcludeApp_Data>
Asp.netコアWebアプリの場合、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>
ルートフォルダ