Powershellによるaspの自動導入Netmvcサイトプロジェクト(二)


詳細
簡単に言えば、導入は「ビルド」->「コピー(パッケージ)」->「構成」です.前編では「構築」を紹介しましたが、この編ではコピー(パッケージ化に慣れているようですが、後でパッケージ化しましょう)についてお話しします.なぜ梱包するのですか?アプリケーションがパブリッシュされるときは、もちろん実行時に必要なファイルだけをパブリッシュしたいのですが、他のファイル、例えば、エンジニアリングファイル、ソースコードなどはパブリッシュする必要はありません.そのため、実行時に必要なファイルを分離し、きれいなPackageを作成する必要があります.

パッケージ–考え方


2つの問題を解決するだけで、パッケージは完成しました.1つ目の問題は、私たちが打ったパッケージにどのようなディレクトリ構造があるべきかということです.2つ目の問題は、どのフォルダをパッケージのどのディレクトリにコピーすべきかということです.

コピーすべきファイル


最初の質問に答える前に、コピーするファイルを見てみましょう.構築されたプログラムセット(.dllおよび.exe)はコピーする必要があります.間違いありませんが、他のファイルはコピーする必要があります.Visual StudioでWeb Projectを開き、各ファイルのBuild Actionプロパティを観察すると、ほとんどのファイルが次の4つのBuild Actionに属していることがわかります.
None:これは、このファイルが構築中に処理されないことを意味します.典型的な例は、ReadmeファイルまたはEULAファイルである.このファイルはパッケージ内でコピーされません.
Compile:このようなファイルは構築中にコンパイルされ、コンパイル結果は生成されたプログラムセット(dllまたはexe)に埋め込まれます.このようなファイルはパッケージ化時にコピーされません.
Content:このファイルは構築中にコンパイルされません.しかし、このファイルはプロジェクト全体のパブリケーションの一部に属しています.そのため、このようなファイルはパッケージ化時にコピーされます.
Embedded Resources:このファイルの内容は、構築中にプログラムセットに埋め込まれた埋め込みリソースとして埋め込まれます.このファイルはパッケージ化中にコピーされません.
したがって、構築されたプログラムセットに加えて、すべてのBuild ActionがContentのファイルタイプもパッケージ化時にコピーされます.
私たちの工事を例に挙げます.
FromZero.App
│  Global.asax [Content]
│  Global.asax.cs [Compile]
│  packages.config [Content]
│  Web.config [Content]
│  Web.Debug.config [None]
│  Web.Release.config [None]
├─bin
│  /* All build results are stored in this directory. */
├─Controllers
│   HomeController.cs [Compile]
├─Properties
│   AssemblyInfo.cs [Compile]
└─Views
    └─Home
          Index.cshtml [Content]

では、コピーするファイルは次のとおりです.
.binフォルダの下にあるすべてのファイル;
すべてのBuild ActionがContent属性のファイル:Global.asax、packages.config、Web.config、Index.cshtml.

パッケージのディレクトリ構造


前節では、コンストラクションによって生成されたすべてのプログラムセットとBuild ActionがContentのファイルがパッケージ化中にコピーされることについて説明しました.では、どこにコピーしますか?答えは対応するディレクトリの下にコピーします.私たちのプロジェクトを例にとると、構築されたプロジェクトをPackageというディレクトリにコピーしたいとします.このPackageディレクトリは、パッケージ化が完了した後、このようになります.
Package
│  Global.asax
│  packages.config
│  Web.config
├─bin
│  /* All build results. */
└─Views
    └─Home
          Index.cshtml

ちょっと待って、ControllerとPropertiesディレクトリはどこへ行きましたか?この2つのディレクトリの下にパブリッシュするファイルが1つもないため、このディレクトリは作成されません.
本当にControllerディレクトリをパブリッシュする必要があるとしたら、どうすればいいですか?では、ルールを使用して0 KBのplaceholderファイルを作成できます.このファイルのBuild ActionプロパティをContentに設定します.
これで、パッケージのルールをまとめることができます.
すべての構築中に生成されたプログラムセットファイルと、Build ActionがContentのファイルをコピーします.
コピーする必要があるすべてのファイルを、そのプロジェクトディレクトリに対応するディレクトリの下にコピーします.ディレクトリの下にパッケージ内でコピーするファイルがない場合は、このディレクトリは生成されません.

パッケージ→コード


私たちは自分で工事のXML構造を解析して上記の規則に従ってパッケージ化する必要がありますか?幸いなことに、全く使いません:これはASP.NET Webエンジニアリングでは$(VSToolsPath)WebMicrosoft.Web.Publishing.targets、定義された_WPPCopyWebApplicationプロセスは、上記のプロセスです.前の例に基づいてCompile-Project関数を変更するだけです.
Function Compile-Project() {
    iex -Command "& '$global_msBuildPath' /t:Rebuild /t:_WPPCopyWebApplication 
/p:WebProjectOutputDir='$global_buildDirPath\Package\' 
/p:UseWPP_CopyWebApplication=True /p:PipelineDependsOnBuild=False '$project_path'"
}

次のようになります.$global_msBuildPathはmsbuildです.exeの位置; /t:Rebuild:最初にRebuildプロセスを実行します.これにより、前回の構築結果が削除され、プロジェクト全体が再構築されます. /t:_WPPCopyWebApplication:当該項目を梱包する; /p:WebProjectOutputDir='$global_buildDirPath\Package\':パッケージ結果全体をbuildDirの下のPackageディレクトリに格納します.このディレクトリが存在しない場合は、このディレクトリを作成します. /p:UseWPP_CopyWebApplication=True:Visual Studio 2010からWebを使用できます.config.\$(Configuration).configファイル対Web.configは、異なるコンパイルオプションで修正されます.この機能を使用できるように、この変数値をTrueに設定する必要がある. /p:PipelineDependsOnBuild=False:UseWPP_CopyWebApplicationTrueに設定する場合は、PipelineDependsOnBuild変数をFalseに設定する必要があります.そうしないと、MSBuildのTargetsのループ参照になります.詳細については、ここを参照してください.
このような長いコマンドはメンテナンスが非常に容易ではないので、これらのコマンドをMSBuildエンジニアリングに置くことができます.まず、XMLファイルを作成します.Deployと名付けてもいいです.xml:


  xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
  ToolsVersion="12.0">
   Name="Build">
    
      Projects="..\src\FromZero.App\FromZero.App.csproj"
      Targets="Rebuild;_WPPCopyWebApplication"
      Properties="WebProjectOutputDir=$(WebAppPublishDir);
                  UseWPP_CopyWebApplication=True;PipelineDependsOnBuild=False;"/>
  

Compile-Projectの関数でMSBuildでこのDeployを呼び出すだけですxmlファイルは、希望するパケットの出力ディレクトリを$(WebAppPublishDir)変数に割り当てるとよい.
$global_deployProject = "$global_buildDirPath\deploy.xml"
Function Compile-Project() {
    iex -Command "& '$global_msBuildPath' 
     /p:WebAppPublishDir='$global_buildDirPath\Package\' '$global_deployProject'"
}

これまで、Compile-Project関数はコンパイルエンジニアリングだけでなく、パッケージ化の能力も備えているため、Deploy-Projectと名前を変更しました.

添付:deploy.ps 1のこれまでのコード

$ErrorActionPreference = 'Stop'
# Environment helpers ------------------------------------
Function Get-MsBuildPath() {
    $msBuildRegPath = "HKLM:\SOFTWARE\Microsoft\MSBuild\ToolsVersions\12.0"
    $msBuildPathRegItem = Get-ItemProperty $msBuildRegPath -Name "MSBuildToolsPath"
    $msBuildPath = $msBuildPathRegItem.MsBuildToolsPath + "msbuild.exe"
    return $msBuildPath
}
# Environment variables ----------------------------------
$global_buildDirPath = Get-Location
$global_msBuildPath = Get-MsBuildPath
$global_solutionPath = "$global_buildDirPath\..\src"
$global_solutionFilePath = "$global_solutionPath\src.sln"
$global_nugetPath = "$global_buildDirPath\tools
uget.exe"
$global_deployProject = "$global_buildDirPath\deploy.xml" # Install nuget packages --------------------------------- Function Install-SolutionPackages() { iex "$global_nugetPath restore $global_solutionFilePath" } $project_path = $global_solutionPath + '\FromZero.App\FromZero.App.csproj' Function Deploy-Project() { iex -Command "& '$global_msBuildPath' /p:WebAppPublishDir='$global_buildDirPath\Package\' '$global_deployProject'" } Install-SolutionPackages Deploy-Project