web-dev-qa-db-ja.com

存在しない場合にmsdeployでApp_Dataを作成し、リモートディレクトリの内容を削除しないようにするにはどうすればよいですか?

次のパッケージ/公開Web設定でアプリケーションをセットアップしました。

  • このアプリケーションを実行するために必要なファイルのみ
  • (チェックされていない)生成されたデバッグシンボルを除外する
  • (チェック済み)App_Dataフォルダーからファイルを除外します
  • (チェック済み)[パッケージ/ SQLの公開]タブで構成されたすべてのデータベースを含める-データベースが構成されていないないことに注意
  • (チェックなし)include IIS IIS Expressで構成された設定)

プロジェクトでは、主にアプリケーションログを処理するために、App_Dataフォルダーを設定しています。

私が見たい(そして期待している)動作は次のとおりです。

  1. 新しいサーバーへの最初のデプロイ時に、アプリケーションがコピーされ、アプリケーションに割り当てられた書き込み権限でApp_Dataフォルダーが作成されます。
  2. 以降の展開では、App_Dataフォルダーは既に存在し、[App_Dataフォルダーからファイルを除外する]がオンになっているため、無視されます。

ただし、msdeployはステップ1を実行していないようです(フォルダーを手動で作成する場合はステップ2で問題ありません)。これ以外にウェブ上でドキュメントを見つけることができませんでした 未回答なので質問 これは私が見ている動作を確認しているようです。

このシナリオでmsdeployを取得してApp_Dataを作成し、初期デプロイメントでアクセス許可を割り当てるにはどうすればよいですか?

28
Emil Lerch

ゼロから始めるときにApp_Dataをデプロイする

@tdykstraは この部分は正しい を取得しました。 App_Dataを取得する(およびACLを自動的に設定する)ために、次のことを行いました。

  1. App_Dataにプレースホルダーファイルを追加する
  2. ビルドアクションをプレースホルダーのコンテンツに設定します(私のプレースホルダーファイルには、それがなぜそこにあるのかを人々に知らせるためのテキストが含まれています)。
  3. チェックなしVS2010のプロジェクトプロパティの[パッケージ/公開Web]タブにある[App_Dataフォルダーからファイルを除外する]

これにより、App_Dataフォルダーが作成され、サーバーで使用できるようになります。ただし、再公開するたびにすべてのファイルが削除されます。これは上記の私の質問の問題#2であり、他のSO 質問 / 回答 )に非常によく似ています。

後続の公開イベントでサーバー上のデータが削除されないようにする

MsDeployには、混乱する可能性のある2つのメカニズムがあります(少なくとも私はそれらを混乱させました)。

  1. ファイルを除外する
  2. MsDeployスキップルール

シナリオに応じて、これらの両方を使用して問題を解決できます。

  1. @ tdykstraのソリューション 次の場合に機能する可能性があります:
    1. App_Data内のファイルの名前を事前に知っておく(例:sqlliteデータベース)
    2. プロジェクトのApp_Dataフォルダーにファイルを含めます
  2. MsDeployスキップルールを使用して、そのディレクトリおよびそのディレクトリ内のファイルのサーバー上のすべての削除を完全にスキップするようにMsDeployに指示します。これはすべての場合に問題を解決しますが、はるかに複雑です。

MsDeployスキップルールの実装

スキップルールを実装するには、右クリックを放棄し、VS 2010で[展開]オプションを選択して、[パッケージ]を右クリックし、コマンドラインに移動し、バッチファイルを再ジグして、コマンドラインを実行する必要があります。この経験に我慢してくれるなら(私はCIプロセスを通じてすべてを自動化しているので、私はそうです)、詳細は次のとおりです。

  1. プロジェクトファイルを編集し、以下を追加します 。 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>
    
  2. パッケージ、プロジェクトをデプロイしない。これにより、ターゲットディレクトリ([パッケージ/公開Web]タブの[パッケージが作成される場所]で定義されます)にZipファイルと.cmdファイルが作成されます。デフォルトでは、これはobj\Debug\Package(またはobj\Release\Package)です。
  3. 結果のコマンドファイルを使用してサイトを展開します

私のテストでは、コマンドファイルをパッケージ化して実行する必要があります。プロジェクトファイルを微調整すると、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ビルドプロセスに組み込むつもりです。最終的な解決策のために私がすることは次のとおりです。

  1. / T:Packageを使用するようにビルドスクリプトを変更します(現在は/ T:MsDeployです)
  2. スクリプト化された検索/置換ルーチンで、生成されたcmdデプロイメントスクリプトを変更します
  3. 変更された展開スクリプトを実行します

これは本当に簡単なはずです。

更新

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オプションなしで)呼び出すことができ、期待どおりに機能します。

19
Emil Lerch

コピーするファイルがない場合、WebDeployはフォルダーを作成しません。シナリオでの回避策の1つは、App_Dataフォルダーからファイルを除外するチェックボックスを使用せず、ダミーファイル(.txtなど)をApp_Dataに配置することです。何も含まれていないファイル)、App_Dataフォルダーにある他のファイル(.sdfファイルなど)のファイル除外ルールを指定します。

個々のファイルの除外(ワイルドカードを使用できます)については、MSDNのデプロイメントFAQ)の最初の質問を参照してください。

http://msdn.Microsoft.com/en-us/library/ee942158.aspx#can_i_exclude_specific_files_or_folders_from_deployment

ダミーファイルメソッドを使用してフォルダーを作成する方法については、このチュートリアルのElmahフォルダーがデプロイされることを確認するを参照してください。

http://www.asp.net/web-forms/tutorials/deployment-to-a-hosting-provider/deployment-to-a-hosting-provider-configuring-project-properties-4-of- 12

9
tdykstra

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で削除をスキップします

7

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'の不満が出なくなります。

0
ceztko