19

パッケージの作り方

msdeploy パッケージを次のように作成します。

msdeploy.exe -verb:sync -source:iisApp=c:\content\ -dest:package=c:\pkg.zip

c:\contentディレクトリには、単一のindex.htmlファイルがあります。

結果

出力は次のようになります。

Info: Adding package (package).
Info: Adding child iisApp (c:\content\).
Info: Adding child createApp (c:\content\).
Info: Adding child contentPath (c:\content\).
Info: Adding child dirPath (c:\content\).
Info: Adding child filePath (c:\content\index.html).
Total changes: 6 (6 added, 0 deleted, 0 updated, 0 parameters changed, 0 bytes copied)

c:\pkg.zipの内容をディレクトリc:\pkgに抽出すると、次のようになります。

archive.xml
systemInfo.xml
Content\c_C
Content\c_C\content
Content\c_C\content\index.html

次のようにパッケージをダンプすると:

msdeploy.exe -verb:dump -source:package=c:\pkg.zip -xml

私は得る:

<output>
    <MSDeploy.iisApp>
        <iisApp path="c:\content\">
            <createApp 
                path="c:\content\" 
                isDest="False" 
                managedRuntimeVersion="" 
                enable32BitAppOnWin64="" 
                managedPipelineMode="" 
                applicationPool="" 
                appExists="True" />
            <contentPath path="c:\content\">
                <dirPath 
                    path="c:\content\" 
                    securityDescriptor="D:" 
                    parentSecurityDescriptors="" 
                    attributes="Directory">
                    <filePath 
                        path="index.html" 
                        size="0" 
                        attributes="Archive" 
                        lastWriteTime="07/07/2011 20:58:00" 
                        securityDescriptor="D:" />
                </dirPath>
            </contentPath>
        </iisApp>
    </MSDeploy.iisApp>
</output>

どうなりたいか

パッケージをサイト ファイルの現在の場所に依存させたくありません。パッケージを顧客に送るつもりですが、パッケージと一緒に出荷されるパッケージ プロセスに関する詳細は必要ありません。パッケージc:\pkg.zipの内容を次のようにしたい:

archive.xml
systemInfo.xml
Content\index.html

パッケージで IIS アプリケーションを作成できるようにしたいので、仮想パスが必要です。また、パッケージをデフォルトの場所にインストールしたいと考えています。したがって、物理パスも変更する必要があります。ダンプを次のようにしたい:

<output>
    <MSDeploy.iisApp>
        <iisApp path="Default Web Site\Site">
            <createApp 
                path="Default Web Site\Site"
                isDest="False" 
                managedRuntimeVersion="" 
                enable32BitAppOnWin64="" 
                managedPipelineMode="" 
                applicationPool="" 
                appExists="False" />
            <contentPath path="c:\inetpub\wwwroot\site">
                <dirPath 
                    path="c:\inetpub\wwwroot\site" 
                    securityDescriptor="D:" 
                    parentSecurityDescriptors="" 
                    attributes="Directory">
                    <filePath 
                        path="index.html" 
                        size="0" 
                        attributes="Archive" 
                        lastWriteTime="07/07/2011 20:58:00" 
                        securityDescriptor="D:" />
                </dirPath>
            </contentPath>
        </iisApp>
    </MSDeploy.iisApp>
</output>

iisAppおよびcreateAppプロバイダーのパス属性を に変更しましたDefault Web Site\Site。そして、contentPathおよびdirPathプロバイダーのパス属性をに変更しましたc:\inetpub\wwwroot\site


質問

  • どうすればこれを達成できますか?
4

4 に答える 4

18

MS Deploy Team Blog によく隠されている便利な機能である MS Deploy の置換ルールを確認する必要があります。

あなたの場合、次のような置換式の山でコマンドラインを拡張する必要があります。

msdeploy.exe 
-verb:sync 
-source:iisApp=c:\content\ 
-dest:package=c:\pkg.zip
-replace:objectName=iisApp,targetAttributeName=path,
         replace="Default Website\Site"
-replace:objectName=createApp,targetAttributeName=path,
         replace="Default Website\Site"
-replace:objectName=contentPath,targetAttributeName=path,
         replace="c:\inetpub\wwwroot\site"
-replace:objectName=dirPath,targetAttributeName=path,match="^c:\content",
         replace="c:\inetpub\wwwroot\site"

これを実行すると、目的の出力が生成されます。

上記のサンプルでは、​​最初の 3 つの置換ルールがタグ名 ( objectName) と属性名 ( targetAttributeName) で一致し、指定された置換文字列で上書きされます。dirPath最後の置換ルールは、「c:\content」で始まるすべてのタグのすべてのパス属性に一致し、属性値のその部分のみを置換文字列に置き換えます。

最後に、パッケージの zip ファイルに元のソース フォルダー名が含まれないようにする方法を見つけられませんでした。唯一の回避策は、"c:\site" などの中立的な一時的な場所からパッケージ化することです。

したがって、手順は次のとおりです。

  • 自分のものを中立的な一時的な場所にコピーします。
  • ここからパッケージを作成します。
  • verb:dump を使用して、生成された xml を表示します。
  • パッケージ内で変更したいすべての置換ルールを追加して、パッケージを再度作成します。
  • 頭痛薬を飲んでください;-)
于 2011-08-04T22:50:19.130 に答える
5

私は多かれ少なかれ同じ問題を抱えていました。

まず最初に:

導入マシン固有の長いパス

その趣旨で、http://sedodream.com/2013/01/13/WebPackagingFixingTheLongPathIssue.aspxにあるトリックを使用しました。

投稿で提案されているように、プロジェクトのProperties/PublishProfilesフォルダーの下にある必要な (複数の) .pubxmlファイルを変更できます。これは、公開プロファイルごとに動作をカスタマイズできるため、私が従ったアプローチです。

私が間違っていなければ、プロジェクトのルート ディレクトリにある{project-name}.wpp.targetsファイル (おそらくまだ存在しない) に同じ変更を適用できると思います。ただし、ここでの変更はWeb パブリッシング パイプライン(wpp) に影響するため、プロジェクトで見つかったすべてのパブリッシング プロファイルに影響します。

でも...

このアプローチは、接続文字列を発行プロファイルによって提供されるものに置き換えるときに、展開を台無しにしようとしています。理由: 接続文字列はビルド時に wpp によって自動的に作成されるため、上記のトリックは接続文字列には影響しません。ふふっ!

その問題に対して私が見つけた解決策は2つあります。

1.)接続文字列を手動で宣言したparameters.xmlファイルを作成しました。パッケージにデプロイしていたので、パッケージの .zip ファイル内の parameters.xml ファイルからそれらをコピーしたのかもしれません。それは役に立ちました。

それらは次のようになります。

<parameter name="myConnection-Web.config Connection String" defaultValue="" tags="SqlConnectionString" 
        description="myConnection Connection String used in web.config by the application to access the database.">
    <parameterEntry kind="XmlFile" scope="DeploymentPackage\\Web\.config$" match="/configuration/connectionStrings/add[@name='myConnection']/@connectionString" />
</parameter>

2.) 以前に変更した同じ.pubxmlファイルの先頭に次の行を含めました。

<AutoParameterizationWebConfigConnectionStrings>false</AutoParameterizationWebConfigConnectionStrings>

そして...ほら!

ISS アプリの作成

上記のアプローチでは、接続文字列を含むいくつかのパラメーターを宣言したことを願っています。

ただし、パッケージを作成すると、parameters.xml を作成したかどうかに関係なく、*.SetParameters.xml テンプレートファイルが作成されます。その中には、最初のパラメーターとして「IIS Web アプリケーション名」が表示されます。これは、公開プロファイルに挿入したものにデフォルト設定されます。それは変更できます。あなたが望むものに。

前にテンプレートと言ったのを覚えていますか? 本気で言っているんだ; それは単なるテンプレートです。その*.SetParameters.xmlファイルを取得して、必要な数のコピーを作成するとします。それらは何のため?環境関連のパラメーター。あなたは持つことができます:

  • DEV.SetParameters.xml
  • QA.SetParameters.xml
  • Staging.SetParameters.xml
  • Production.SetParameters.xml
  • ...などなど

次に、ジョブ (または環境) に最適なパラメーター ファイルを次のように使用します。

{yourProjectName}.deploy.cmd /Y /M:{targetServer} [...] -setParamFile:QA.SetParameters.xml

もちろん、または同等の MsDeploy コマンドライン。

現在、既定では、ビルド時に作成され、パッケージ内のarchive.xmlファイルに格納されているマニフェストは、何よりもまずiisAppプロバイダーを使用します。createAppプロバイダーとは異なり、このプロバイダーはディレクトリが存在しない場合に実際にディレクトリを作成します。少なくとも TechNet のこのメモによると:

「iisApp プロバイダーとは異なり、新しいアプリケーションの物理フォルダーが存在しない場合、createApp プロバイダーは、親サイトのフォルダーの下に物理フォルダーを作成しません。構成内にそのようなフォルダーへの参照を作成するだけです。必要な場合は、作成された物理フォルダーは、createApp を使用する前または後に手動で作成する必要があります。構成でのアプリケーションの作成、フォルダーが存在しない場合はアプリケーションの物理フォルダーの作成、新しいアプリケーションのフォルダーへのコンテンツ ファイルのコピーを含む一連の手順です。」

喜んでリンクを含めたいと思います...しかし、私は 10 ポイント以上持っていないので、投稿ごとに 1 つだけ許可されています。図に行く!:)

つまり、要するに...

... 最初の部分で行った作業により、展開時にターゲット サーバーにフォルダーを作成するために、おそらく多くのことを行う必要はありません。

ただし、それをオーバーライドする必要がある場合は、独自のマニフェスト ファイルを定義してそれからデプロイすることもできます (別のトピック)... または、@peter_raven のアドバイスに従い-Replace、MsDeploy のルールを使用してその値をオーバーライドすることもできます。

どちらもチャームとして機能します。

于 2014-01-28T00:59:23.520 に答える
4

以下に示すように、kind、scope、および match プロパティを指定することで、パッケージ プレフィックスが削除されます。

"msdeploy.exe" \
     -verb:sync                                                   \
     -source:iisApp="[Path to your website contents]"             \
     -declareParam:name="IIS Web Application Name",kind="ProviderPath",scope="IisApp",match="^C:\\path\\to\\your\\site\\folder",defaultValue="Default Web Site/SomeSite"  \
     -dest:package=[WebDeployPackageName].zip
于 2015-06-22T20:48:09.143 に答える
1

@SkyFighter のソリューションを使用しているときに、手動で定義された接続文字列の問題を解決することができました。これで、自動パラメーター化機能を使用して、接続文字列パラメーターに正しいスコープを設定できます。

幸いなことに、WPP 内に挿入する場所があります。残念ながら、新しいターゲットの配置を絞り込むには、 SomeTargetDependsOn変数ではなくAfterTarget / BeforeTargetを使用する必要がありました。

そして、ここにターゲット自体があります:

<Target Name="Replace_WebConfigsToAutoParmeterizeCS_TransformScope"
        AfterTargets="PreAutoParameterizationWebConfigConnectionStrings"
        BeforeTargets="AutoParameterizationWebConfigConnectionStringsCore"
        Condition=" '$(EnableAddReplaceToUpdatePacakgePath)'=='true' ">
  <ItemGroup>
    <_WebConfigsToAutoParmeterizeCS>
      <TransformScope>$([System.String]::Copy('%(TransformScope)').Replace('$([System.IO.Path]::GetFullPath($(WPPAllFilesInSingleFolder)))', '$(PackagePath)'))</TransformScope>
    </_WebConfigsToAutoParmeterizeCS>
  </ItemGroup>
</Target>

これは、長いパスを修正するためのサイードのサンプルと同じ変数によって駆動されます。したがって、このターゲットは、それらの変数が既に利用可能な場所に配置してください。

PS このトリック/ハックには、メタデータ操作が最初に導入された MSBuild v3.5 以上が必要です。

于 2015-04-09T09:30:40.603 に答える