次のパッケージ/公開Web設定でアプリケーションをセットアップしました。
プロジェクトでは、主にアプリケーションログを処理するために、App_Dataフォルダーを設定しています。
私が見たい(そして期待している)動作は次のとおりです。
ただし、msdeployはステップ1を実行していないようです(フォルダーを手動で作成する場合はステップ2で問題ありません)。これ以外にウェブ上でドキュメントを見つけることができませんでした 未回答なので質問 これは私が見ている動作を確認しているようです。
このシナリオでmsdeployを取得してApp_Dataを作成し、初期デプロイメントでアクセス許可を割り当てるにはどうすればよいですか?
@tdykstraは この部分は正しい を取得しました。 App_Dataを取得する(およびACLを自動的に設定する)ために、次のことを行いました。
これにより、App_Dataフォルダーが作成され、サーバーで使用できるようになります。ただし、再公開するたびにすべてのファイルが削除されます。これは上記の私の質問の問題#2であり、他のSO 質問 / 回答 )に非常によく似ています。
MsDeployには、混乱する可能性のある2つのメカニズムがあります(少なくとも私はそれらを混乱させました)。
シナリオに応じて、これらの両方を使用して問題を解決できます。
スキップルールを実装するには、右クリックを放棄し、VS 2010で[展開]オプションを選択して、[パッケージ]を右クリックし、コマンドラインに移動し、バッチファイルを再ジグして、コマンドラインを実行する必要があります。この経験に我慢してくれるなら(私はCIプロセスを通じてすべてを自動化しているので、私はそうです)、詳細は次のとおりです。
プロジェクトファイルを編集し、以下を追加します 。 AbsolutePath引数は正規表現であるため、次のように工夫することができます。
<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>
私のテストでは、コマンドファイルをパッケージ化して実行する必要があります。プロジェクトファイルを微調整すると、msbuildに必要な-skipルールをコマンドファイルに入れるように指示されます。ただし、VS 2010から直接「公開」機能を使用する コマンドファイルを実行していないようです ( このウォークスルー の警告を参照)... msdeployを直接呼び出しますプロジェクトファイルのスキップルールを尊重していないようです。これは、msbuild -T:Packageとmsbuild -T:MsDeployPublishを使用してプロジェクトをビルドするVSの違いだと思いますが、これはテストしていません。
最後に、少なくともVS 2010 SP1では、コマンドファイルは完全には正しくありません。 this SO answer で何がうまくいかないかについての素晴らしい説明がありますが、基本的に、VS(または/ t:Packageターゲットがより良い犯人である可能性があります)はサイトを指定せずにマシンに公開するコマンドファイル。これを修正するには、なんらかの方法で「?site =sitename」を取得する必要があります(おそらくこれは?site = Default + Web + Site、https://machine:8172/MsDeploy.axd?site = Default + Web + Site)の完全なURLをcomputerName引数の最後に。
私が抱えていた問題は、コマンドファイル(バッチファイル)がコマンドライン引数を誤って解析するため(エスケープされていても)、コマンドラインでsite = anythingを使用するのに苦労することでした。 cmdファイルを直接変更する以外にこの問題を回避する方法はわかりませんが、テストのために、失敗したテスト実行から見たmsdeploy.exe出力をコピーし、スクリプトなしで直接msdeploy.exeを呼び出すように変更しました。
これが機能するようになったので、これをCIビルドプロセスに組み込むつもりです。最終的な解決策のために私がすることは次のとおりです。
これは本当に簡単なはずです。
更新
PowerShellで思いついたスクリプト化された検索/置換ルーチンは次のとおりです。
(Get-Content "project.deploy.cmd")
-replace('^set _ArgComputerName=$'
,"set ArgComputerName=https://server:8172/MsDeploy.axd?Site=Default+Web+Site")
| Out-File -Encoding ascii deploy.cmd
それが実行されると、deploy.cmdを(/ Mオプションなしで)呼び出すことができ、期待どおりに機能します。
コピーするファイルがない場合、WebDeployはフォルダーを作成しません。シナリオでの回避策の1つは、App_Dataフォルダーからファイルを除外するチェックボックスを使用せず、ダミーファイル(.txtなど)をApp_Dataに配置することです。何も含まれていないファイル)、App_Dataフォルダーにある他のファイル(.sdfファイルなど)のファイル除外ルールを指定します。
個々のファイルの除外(ワイルドカードを使用できます)については、MSDNのデプロイメントFAQ)の最初の質問を参照してください。
ダミーファイルメソッドを使用してフォルダーを作成する方法については、このチュートリアルのElmahフォルダーがデプロイされることを確認するを参照してください。
VisualStudio内からPublish Web
ダイアログを使用すると、なんとか機能するようになりました。注:App_Data
だけでなく、どのフォルダーでも機能します。
これは基本的な.pubxml
プロファイルです。
<?xml version="1.0" encoding="utf-8"?>
<!--
This file is used by the publish/package process of your Web project. You can customize the behavior of this process
by editing this MSBuild file. In order to learn more about this please visit http://go.Microsoft.com/fwlink/?LinkID=208121.
-->
<Project ToolsVersion="4.0" xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<AfterAddIisSettingAndFileContentsToSourceManifest>AddCustomSkipRules</AfterAddIisSettingAndFileContentsToSourceManifest>
<WebPublishMethod>MSDeploy</WebPublishMethod>
<LastUsedBuildConfiguration>Local</LastUsedBuildConfiguration>
<LastUsedPlatform>Any CPU</LastUsedPlatform>
<SiteUrlToLaunchAfterPublish />
<ExcludeApp_Data>False</ExcludeApp_Data>
<MSDeployServiceURL>localhost</MSDeployServiceURL>
<DeployIisAppPath>SuperCoolAwesomeAppName</DeployIisAppPath>
<RemoteSitePhysicalPath />
<SkipExtraFilesOnServer>False</SkipExtraFilesOnServer>
<MSDeployPublishMethod>InProc</MSDeployPublishMethod>
<EnableMSDeployBackup>False</EnableMSDeployBackup>
<UserName />
<_SavePWD>False</_SavePWD>
<LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>
</PropertyGroup>
<PropertyGroup>
<UseMsDeployExe>true</UseMsDeployExe>
</PropertyGroup>
<Target Name="CreateEmptyFolders">
<Message Text="Adding empty folders to Files" />
<MakeDir Directories="$(_MSDeployDirPath_FullPath)\Files\Folder 1" />
<MakeDir Directories="$(_MSDeployDirPath_FullPath)\Files\Folder 2" />
<MakeDir Directories="$(_MSDeployDirPath_FullPath)\Files\Folder 3\Test"/>
</Target>
<Target Name="AddCustomSkipRules" DependsOnTargets="CreateEmptyFolders">
<Message Text="Adding Custom Skip Rules" />
<ItemGroup>
<MsDeploySkipRules Include="SkipFilesInFilesFolder">
<SkipAction>Delete</SkipAction>
<ObjectName>filePath</ObjectName>
<AbsolutePath>$(_DestinationContentPath)\\Files\\.*</AbsolutePath>
<Apply>Destination</Apply>
</MsDeploySkipRules>
<MsDeploySkipRules Include="SkipFoldersInFilesFolders">
<SkipAction></SkipAction>
<ObjectName>dirPath</ObjectName>
<AbsolutePath>$(_DestinationContentPath)\\Files\\.*\\*</AbsolutePath>
<Apply>Destination</Apply>
</MsDeploySkipRules>
</ItemGroup>
</Target>
</Project>
これを説明する詳細な投稿は次のとおりです。
MsDeploy公開プロファイル.pubxmlを使用して、IISに空のフォルダー構造を作成し、MsDeploySkipRulesで削除をスキップします
EmilとLenielの回答を簡潔に要約して簡略化し、追加と更新のためにApp_Data
のデプロイを許可し、削除を防止したい場合は、これを.pubxml
に追加します。
<Project>
...
<PropertyGroup>
<UseMSDeployExe>true</UseMSDeployExe>
<ExcludeApp_Data>False</ExcludeApp_Data>
</PropertyGroup>
<Target Name="AddCustomSkipRules"
AfterTargets="AddIisSettingAndFileContentsToSourceManifest">
<Message Text="Adding Custom Skip Rules" />
<ItemGroup>
<MsDeploySkipRules Include="SkipDeleteAppData">
<SkipAction>Delete</SkipAction>
<ObjectName>filePath</ObjectName>
<AbsolutePath>App_Data\\.*</AbsolutePath>
</MsDeploySkipRules>
<MsDeploySkipRules Include="SkipDeleteAppData">
<SkipAction>Delete</SkipAction>
<ObjectName>dirPath</ObjectName>
<AbsolutePath>App_Data</AbsolutePath>
</MsDeploySkipRules>
</ItemGroup>
</Target>
</Project>
<UseMSDeployExe>true</UseMSDeployExe>
が本当に必要です。そうしないと、Unrecognized skip directive 'skipaction'
の不満が出なくなります。