ASP. NET MVC 제로 부터 - 자동화 배치 (둘)
이것 은 이 시리즈 의 다섯 번 째 편 입 니 다. 앞의 네 편 은 참고 하 시기 바 랍 니 다.
포장. - 아이디어.
초 나라 의 두 가지 문제 만 해결 하면 포장 이 완성 된다. 첫 번 째 문 제 는 우리 가 만 든 가방 이 어떤 디 렉 터 리 구 조 를 가 져 야 하 는 지 하 는 것 이다.두 번 째 문 제 는 어떤 폴 더 를 가방 의 어떤 디 렉 터 리 에 복사 해 야 하 느 냐 하 는 것 이다.
어떤 파일 을 복사 해 야 합 니까?
첫 번 째 질문 에 대답 하기 전에 어떤 파일 을 복사 해 야 하 는 지 살 펴 보 자.구 축 된 프로그램 집합 (. dll 과. exe) 은 복사 해 야 합 니 다. 맞습니다. 하지만 이 외 에 도 복사 해 야 할 파일 이 있 습 니 다.Visual Studio 에서 웹 Project 를 열 고 모든 파일 의 Build Action 속성 을 관찰 하면 거의 모든 파일 이 다음 과 같은 네 가지 Build Action 에 속 하 는 것 을 발견 할 수 있 습 니 다.
따라서 구 축 된 프로그램 집합 을 제외 한 모든 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]
그러면 복사 해 야 할 파일 은:
패키지 의 디 렉 터 리 구조
지난 절 에 서 는 생 성 된 프로그램 집합 과 Build Action 을 콘 텐 츠 로 하 는 모든 파일 을 포장 하 는 과정 에서 복사 하 는 것 을 소개 했다.그럼 어디로 복사 할 까요?정 답 은 해당 목록 아래로 복사 하 는 것 이다.우리 의 프로젝트 를 예 로 들 면, 우리 가 구축 한 프로젝트 를 패키지 라 는 디 렉 터 리 로 복사 하 기 를 원한 다 면, 이 패키지 디 렉 터 리 는 포장 이 끝 난 후에 이렇게 해 야 한다.
Package
│ Global.asax
│ packages.config
│ Web.config
│
├─bin
│ /* All build results. */
│
└─Views
└─Home
Index.cshtml
잠깐 만, Controller 와 Properties 디 렉 터 리 가 어디 갔 지?이 두 디 렉 터 리 아래 에 발표 할 파일 이 하나 도 없 기 때문에 이 디 렉 터 리 도 만 들 지 않 습 니 다.
컨트롤 러 디 렉 터 리 가 필요 하 다 고 가정 하면 어떻게 해 야 합 니까?그러면 우 리 는 규칙 을 이용 하여 0KB 의 placeholder 파일 을 만 들 수 있 습 니 다.또한 이 파일 의 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_CopyWebApplication
를 True
로 설정 하면 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.