티스토리 뷰
ASP.NET 웹사이트를 간편하게 서버에 배포할 때 Web Deploy (MS Deploy) 도구를 주로 사용합니다. 여기에서는 Web Deploy도구를 사용할 때 사용할 수 있는 배포 프로파일(Publish Profile)에 대해 살펴봅니다. VisualStudio 2019와 ASP.NET Core 웹사이트를 기준으로 작성되었습니다.
Publish Profile 생성
Visual Sutido에서 웹사이트 배포를 위해서는 Publish Profile(배포 프로파일)을 생성해야합니다. Solution Explorer에서 웹사이트를 마우스 우클릭 하신 후 Publish를 클릭하시면 Publish Profile을 생성하실 수 있는 창이 나타납니다.
배포대상과 배포위치, 인증정보 등 웹사이트 배포에 필요한 정보를 입력하시면 배포를 진행하게 되는데요. 한번 이 작업이 진행되면 .pubxml 확장자를 가진 Publish Profile이 프로젝트의 /Properties/PublishProfiles 폴더에 생성됩니다. 이 후로는 Visual Studio에서 Publish를 클릭하시면 이 파일을 선택할 수 있게되며, 배포를 간편히 진행할 수 있게됩니다.
보안에 대한 주의사항
프로젝트의 /Properties/PublishProfiles 폴더에 생성된 .pubxml 파일에는 배포를 편리하게 만들어주는 다양한 정보가 포함되어 있습니다. 이 파일에는 배포를 위해 서버 위치, 아이디, 비밀번호 등의 인증정보 외에도 DBMS 연결정보, 환경변수 등이 포함될 수 있습니다.
<Project>
<PropertyGroup>
<PublishProtocol>Kudu</PublishProtocol>
<PublishSiteName>website</PublishSiteName>
<!-- [주의] .pubxml 파일에는 민감한 정보가 포함될 수 있으므로 허가되지 않은 사람에게 유출되어서는 안됩니다 -->
<UserName>myuserid</UserName>
<Password>mypassword1234</Password>
</PropertyGroup>
</Project>
따라서 이 파일은 GitHub 등의 Source Control로 전송되지 않도록 해야하며 허가되지 않은 다른 사람에게 유출되지 않게 해야합니다.
배포하지 않을 파일설정
특정 파일이나 폴더가 배포되지 않게 제외 할 수 있습니다. 이러한 설정은 .pubxml 파일을 직접 편집하여 추가할 수 있습니다. 여기에서는 <Content />를 이용한 방법과 <MsDeploySkipRules />를 이용한 방법 두 가지를 간단히 소개합니다.
방법1: <Content />를 이용한 제외
<Content />를 사용하여 서버에 배포되지 않을 대상을 지정 할 수 있습니다. 만약 해당 파일이 이미 서버에 업로드되어 있다면, 서버에서 해당 파일이 삭제됩니다. <Project /> 하위에 <ItemGroup />를 추가하고 <Content />를 추가하시면 됩니다. 아래는 ClientApp 하위의 모든 .config 파일을 제외하는 예제입니다.
<Project>
<!-- 배포에서 제외할 파일 (서버에 업로드되어 있는 파일도 삭제함)-->
<ItemGroup>
<Content Update="ClientApp/**/*.config" CopyToPublishDirectory="Never" />
</ItemGroup>
</Project>
파일의 경로는 Grunt의 Gobbing Pattern을 사용하여 표현할 수 있습니다. "ClientApp/**/*.config"는 ClientApp의폴더와 하위 폴더의 모든 .config파일을 의미합니다.
방법2: <MsDeploySkipRules />를 이용한 제외
<Content /> 외에도 <MsDeploySkipRules />를 사용하여 제외 설정을 할 수 있습니다. 폴더를 제외하려면 <ObjectName/>에 dirPath
를 입력하고, 파일을 제외하려면 filePath
를 설정해주세요. 대상 경로는 <AbsolutePath/>에 입력합니다.
<Project>
<ItemGroup>
<!-- ClientApp\src 폴더를 배포에서 제외합니다 -->
<MsDeploySkipRules Include="CustomSkipFolder">
<ObjectName>dirPath</ObjectName>
<AbsolutePath>ClientApp\\src</AbsolutePath>
</MsDeploySkipRules>
</ItemGroup>
</Project>
<MsDeploySkipRules />는 <Content />와 달리 이미 서버에 업로드된 파일은 삭제하지 않습니다.
<Project>
<ItemGroup>
<!-- env.develop 파일은 배포되지 않음. 또한 서버에서 env.develop 파일이 삭제됨 -->
<Content Update="ClientApp/env.develop" CopyToPublishDirectory="Never" />
<!-- env.test 파일은 배포되지 않음. 이미 서버에 업로드된 env.test파일은 삭제하지 않음-->
<MsDeploySkipRules Include="CustomSkipFolder">
<ObjectName>filePath</ObjectName>
<AbsolutePath>ClientApp/env.test</AbsolutePath>
</MsDeploySkipRules>
</ItemGroup>
</Project>
배포에 포함될 파일설정
WebDeploy는 기본적으로 프로젝트에 포함된 파일만 배포 합니다. 프로젝트 외부에 존재하거나 프로젝트에 포함되지 않는 파일은 배포에 포함되지 않습니다. 이 경우 <Content /> 또는 <ResolvedFileToPublish />를 사용하여 배포 대상에 포함 할 수 있습니다.
방법1: <Content />를 통한 배포대상 추가
특정 파일이나 폴더를 배포하기 위해 <Content Include="대상경로" />를 사용할 수 있습니다. 아래 예제는 /ClientApp/dist 폴더를 배포대상에 포함합니다.
<Project>
...
<!-- 배포에서 제외할 파일 (서버에 업로드되어 있는 파일도 삭제함)-->
<ItemGroup>
<Content Include="ClientApp\dist\**\*" />
</ItemGroup>
</Project>
방법2: <ResolvedFileToPublish />를 통한 배포대상 추가
<ResolvedFileToPublish />를 사용하면 특정 경로의 파일을 지정한 위치에 배포되도록 할 수 있습니다. 아래 예제는 프로젝트 외부에 존재하는 ReadMe.md 파일을 ClientApp\dist\ReadMe.md 위치에 배포되도록 합니다.
<Project>
<ItemGroup>
<ResolvedFileToPublish Include="..\ReadMe.md">
<RelativePath>ClientApp\dist\ReadMe.md</RelativePath>
</ResolvedFileToPublish>
</ItemGroup>
</Project>
배포 전후로 실행
배포 시작 전이나 배포 후에 특정한 동작을 수행해야할 때가 있습니다. ASP.NET Core프로젝트에서는 BeforePublish
나 AfterPublish
를 통해 명령을 실행할 수 있습니다. 반면에 .NET Framework 기반 ASP.NET 프로젝트는 이 기능들을 지원하지 않기 때문에 MSBuild.Extension.Pack 패키지 설치를 통해 명령을 실행해야합니다.
ASP.NET Core 프로젝트의 경우
BeforePublish
나 AfterPublish
내부에 <Message />
를 사용하여 콘솔에 필요한 메시지를 내보낼 수 있습니다. 또한 <Exec />
를 통해 파일을 실행할 수 있습니다. 아래 코드는 배포를 시작하기 전에 지정된 Message를 콘솔에 출력합니다. 배포가 종료된 후에는 echo 명령을 통해 afterPublish.txt 파일을 프로젝트 루트에 생성합니다.
<Project>
<Target Name="custom before publish" BeforeTargets="BeforePublish">
<Message Text="Message - BeforePublish" Importance="high" />
</Target>
<Target Name="custom after publish" AfterTargets="AfterPublish">
<Exec Command="echo "publish completed" >> afterPublish.txt" />
</Target>
</Project>
ASP.NET (.NET Framework) 프로젝트의 경우
.NET Framework 기반 ASP.NET 프로젝트의 경우 MSBuild.Extension.Pack 패키지를 통해 빌드 전이나 이후에 필요한 명령을 실행할 수 있습니다.
- 먼저 Nuget Package Manager를 통해 MSBuild.Extension.Pack를 설치해주세요.
PM> Install-Package MSBuild.Extension.Pack -Version 1.9.1 - .pubxml 파일에 아래와 같은 코드를 추가해주세요.
GatherAllFilesToPublish
는 배포 시작 전에 실행됩니다. 배포 종료 후에 실행하고자 할 때에는 조금 더 복잡합니다. 배포 종료 시점에 실행을 지원하지 않기 때문에 직접 이를 구현해야합니다. 예를들어 PowerShell 스크립트를 작성하여 프로젝트의 bin 폴더에 생성된 파일의 날짜를 유추하여 배포가 종료되었다고 판단되었을 때 특정 명령을 실행하는 방법도 있고, 100초 대기 후 명령을 실행하는 간단한 방법도 있습니다.<Project> <!-- GatherAllFilesToPublish는 배포 전에 실행됨. 아래는 100초간 대기하여 배포가 종료되었을 때 명령을 실행하는 예제 --> <Target Name="before publsih" AfterTargets="GatherAllFilesToPublish"> <AsyncExec Command="powershell.exe sleep 100;powershell.exe echo "publish completed" >> afterPublish.txt"></AsyncExec> </Target> </Project>
'Web > ASP.NET Core' 카테고리의 다른 글
ASP.NET Core에 Vue앱 추가하기 (0) | 2023.11.15 |
---|---|
Application State vs 전역 Static 변수 (0) | 2019.08.19 |
ASP.NET Core Identity 에러 지역화 (0) | 2019.04.08 |
- MS SQL
- Xamarin.Forms 요약
- ios
- TypeScript
- VisualStudio
- Vue
- WPF
- material-ui
- Xamarin.iOS
- .NET Standard
- Xamarin.Forms eBook
- Android
- c#
- ASP.NET Core
- flutter
- StringComparison
- Xamarin.Forms
- npm
- Xamarin
- React
- Total
- Today
- Yesterday