ASP. NET MVC 제로 부터 - 자동화 배치 (둘)

이 글 은 나의 github 블 로그 에서 온 것 이다.http://lxconan.github.io 가 져 왔 어
이것 은 이 시리즈 의 다섯 번 째 편 입 니 다. 앞의 네 편 은 참고 하 시기 바 랍 니 다.
  • ASP. NET MVC 0 부터 – Create and Run
  • ASP. NET MVC 0 부터 – Web. config
  • ASP. NET MVC 0 부터 - 처리 요청
  • ASP. NET MVC 0 부터 - 자동화 배치 (그 중 하나)
  • 쉽게 말 하면 배 치 는 '빌 드 (Build)' - > '복사 (포장)' - > '설정' 입 니 다.전편 에서 우 리 는 '구축' 을 소개 했다. 그러면 이 편 은 복사 (우리 가 포장 하 는 것 에 더 익숙 한 것 같 으 니 나중에 포장 하 라 고 하 자) 에 대해 이야기 하 자.왜 싸 요?응용 프로그램 이 발표 되 었 을 때 우 리 는 당연히 실행 에 필요 한 파일 만 발표 하 기 를 원 했 고 다른 파일, 예 를 들 어 프로젝트 파일, 소스 코드 등 은 발표 할 필요 가 없 었 다.따라서 실행 에 필요 한 파일 을 분리 해서 깨끗 한 패키지 로 만들어 야 합 니 다.
    포장. - 아이디어.
    초 나라 의 두 가지 문제 만 해결 하면 포장 이 완성 된다. 첫 번 째 문 제 는 우리 가 만 든 가방 이 어떤 디 렉 터 리 구 조 를 가 져 야 하 는 지 하 는 것 이다.두 번 째 문 제 는 어떤 폴 더 를 가방 의 어떤 디 렉 터 리 에 복사 해 야 하 느 냐 하 는 것 이다.
    어떤 파일 을 복사 해 야 합 니까?
    첫 번 째 질문 에 대답 하기 전에 어떤 파일 을 복사 해 야 하 는 지 살 펴 보 자.구 축 된 프로그램 집합 (. dll 과. exe) 은 복사 해 야 합 니 다. 맞습니다. 하지만 이 외 에 도 복사 해 야 할 파일 이 있 습 니 다.Visual Studio 에서 웹 Project 를 열 고 모든 파일 의 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. sax, packages. config, Web. config, Index. cshtml.

  • 패키지 의 디 렉 터 리 구조
    지난 절 에 서 는 생 성 된 프로그램 집합 과 Build Action 을 콘 텐 츠 로 하 는 모든 파일 을 포장 하 는 과정 에서 복사 하 는 것 을 소개 했다.그럼 어디로 복사 할 까요?정 답 은 해당 목록 아래로 복사 하 는 것 이다.우리 의 프로젝트 를 예 로 들 면, 우리 가 구축 한 프로젝트 를 패키지 라 는 디 렉 터 리 로 복사 하 기 를 원한 다 면, 이 패키지 디 렉 터 리 는 포장 이 끝 난 후에 이렇게 해 야 한다.
    Package
    │  Global.asax
    │  packages.config
    │  Web.config
    │
    ├─bin
    │  /* All build results. */
    │
    └─Views
        └─Home
              Index.cshtml

    잠깐 만, Controller 와 Properties 디 렉 터 리 가 어디 갔 지?이 두 디 렉 터 리 아래 에 발표 할 파일 이 하나 도 없 기 때문에 이 디 렉 터 리 도 만 들 지 않 습 니 다.
    컨트롤 러 디 렉 터 리 가 필요 하 다 고 가정 하면 어떻게 해 야 합 니까?그러면 우 리 는 규칙 을 이용 하여 0KB 의 placeholder 파일 을 만 들 수 있 습 니 다.또한 이 파일 의 Build Action 속성 을 Content 로 설정 합 니 다.
    이로써 우 리 는 포장 의 규칙 을 정리 할 수 있다.
  • 모든 구축 과정 에서 생 성 된 프로그램 집합 파일 과 Build Action 을 Content 로 하 는 파일 을 복사 합 니 다.
  • 복사 해 야 할 모든 파일 을 그 가 있 는 프로젝트 디 렉 터 리 와 대응 하 는 디 렉 터 리 아래 에 복사 합 니 다. 만약 에 특정한 디 렉 터 리 아래 에 파일 을 압축 해서 복사 해 야 하 는 것 이 없다 면 이 디 렉 터 리 를 생 성하 지 않 습 니 다.

  • 포장 - 코드
    우 리 는 공사 의 XML 구 조 를 스스로 분석 한 후에 상술 한 규칙 에 따라 포장 해 야 합 니까?다행히도, 전혀 사용 하지 않 습 니 다. 이것 은 ASP. NET 웹 프로젝트 에서 $(VSToolsPath) \ \ 웹 \ Microsoft. 웹. Publishing. targets 를 인용 하기 때 문 입 니 다. 그 중에서 정 의 된 *WPPCopy Webapplication * 과정 은 바로 우리 가 이상 에서 설명 한 과정 입 니 다.우 리 는 위의 예 를 바탕 으로 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 부터 웹 config. \ $(Configuration). config 파일 을 사용 하여 웹 config 를 서로 다른 컴 파일 옵션 에서 수정 할 수 있 습 니 다.이 기능 을 사용 하기 위해 서 는 이 변 수 를 True 로 설정 해 야 합 니 다.
  • /p:PipelineDependsOnBuild=False: UseWPP_CopyWebApplicationTrue 로 설정 하면 PipelineDependsOnBuild 변 수 를 False 로 설정 해 야 합 니 다. 그렇지 않 으 면 MSBuild 의 Targets 순환 참조 가 발생 합 니 다.구체 적 인 기술 세부 사항 은 여 기 를 참조 하 세 요.

  • 이렇게 긴 명령 은 유지 하기 가 매우 쉽 지 않 기 때문에 우 리 는 이 명령 들 을 MSBuild 프로젝트 에 넣 을 수 있다.우선, 우 리 는 XML 파일 을 만 듭 니 다. Deploy. xml 라 고 명명 해도 괜 찮 습 니 다.
    <?xml version="1.0" encoding="utf-8"?>
    <Project 
     xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
     ToolsVersion="12.0">
      <Target Name="Build">
        <MSBuild
     Projects="..\src\FromZero.App\FromZero.App.csproj" 
     Targets="Rebuild;_WPPCopyWebApplication"
     Properties="WebProjectOutputDir=$(WebAppPublishDir);UseWPP_CopyWebApplication=True;PipelineDependsOnBuild=False;"/>
      </Target>
    </Project>

    이렇게 하면 우 리 는 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

    좋은 웹페이지 즐겨찾기