Powershell을 이용하여 asp. 자동 배치netmvc 사이트 프로젝트(二)

자세히 보기
간단히 말해 배포는 구축(Build) – > 복제(패키지) – > 구성입니다.전편에서'구축'을 소개했는데 이 편에서는 카피(포장에 더 익숙한 것 같으니 앞으로 포장하라고 하자)에 대해 이야기했다.왜 싸요?응용 프로그램이 발표될 때 우리는 당연히 실행할 때 필요한 파일만 발표하고 다른 파일, 예를 들어 프로젝트 파일, 원본 코드 등은 발표할 필요가 없다.따라서 우리는 실행할 때 필요한 파일을 분리해서 깨끗한 패키지를 만들어야 한다.
패키지 – 사고 방식
초나라 두 가지 문제만 해결하면 포장이 완성된다. 첫 번째 문제는 우리가 포장한 가방이 어떤 목록 구조가 있어야 하는가이다.두 번째 문제는 어떤 폴더를 가방의 어떤 디렉터리로 복사해야 하는가이다.
어떤 파일을 복사해야 하는가
첫 번째 질문에 대답하기 전에 어떤 파일을 복사해야 하는지 살펴보자.구축된 프로그램 집합 (.dll,.exe) 은 복사해야 하지만, 그것들 이외에 다른 파일도 복사해야 한다.Visual Studio에서 웹 프로젝트를 열고 각 파일의 Build Action 속성을 살펴보면 거의 모든 파일이 다음 네 가지 Build Action에 속합니다.
None: 이것은 이 파일이 구축하는 과정에서 아무런 처리도 하지 않는다는 것을 의미합니다.일반적인 예는 Readme 또는 EULA(End User License Agreement) 파일입니다.이런 파일은 포장에서 복사되지 않는다.
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 디렉터리는 어디로 갔지?이 두 디렉터리 아래에 발표할 파일이 하나도 없기 때문에 이 디렉터리도 만들 수 없습니다.
만약 당신이 확실히 Controller 디렉터리를 발표해야 한다면 어떻게 해야 합니까?그러면 우리는 규칙을 이용하여 0KB의placeholder 파일을 만들 수 있습니다.또한 이 파일의 Build Action 등록 정보를 Content로 설정합니다.
이로써 우리는 포장의 규칙을 총결해 낼 수 있다.
구성 과정에서 생성된 모든 프로그램 세트 파일과 Build Action이 Content인 파일을 복사합니다.
복사할 모든 파일을 프로젝트 디렉터리에 대응하는 디렉터리 아래로 복사합니다. 디렉터리에 복사할 파일이 없으면 이 디렉터리를 생성하지 않습니다.
패키지 - 코드
우리는 스스로 프로젝트의 XML 구조를 해석한 후에 상술한 규칙에 따라 포장해야 합니까?다행히도 전혀 사용하지 않습니다: 이것은 ASP에 있기 때문입니다.NET 웹 프로젝트에서 $(VSTOolspath)\Web\Microsoft.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 프로젝트에 놓을 수 있다.우선, Deploy라고 명명할 수 있는 XML 파일을 만듭니다.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.ps1 지금까지의 코드
$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

좋은 웹페이지 즐겨찾기