Visual Studio를 사용하여 웹 배포 ASP.NET: 추가 파일 배포
작성자 : Tom Dykstra
이 자습서 시리즈에서는 Visual Studio 2012 또는 Visual Studio 2010을 사용하여 ASP.NET 웹 애플리케이션을 Azure App Service Web Apps 또는 타사 호스팅 공급자에 배포(게시)하는 방법을 보여 줍니다. 시리즈에 대한 자세한 내용은 시리즈의 첫 번째 자습서를 참조하세요.
개요
이 자습서에서는 Visual Studio 웹 게시 파이프라인을 확장하여 배포하는 동안 추가 작업을 수행하는 방법을 보여 줍니다. 작업은 프로젝트 폴더에 없는 추가 파일을 대상 웹 사이트에 복사하는 것입니다.
이 자습서에서는 robots.txt추가 파일을 복사합니다. 이 파일을 프로덕션에 배포하지 않고 스테이징에 배포하려고 합니다. 프로덕션에 배포 자습서에서 이 파일을 프로젝트에 추가하고 프로덕션 게시 프로필을 구성하여 제외했습니다. 이 자습서에서는 배포하려는 모든 파일에 유용하지만 프로젝트에 포함하지 않으려는 이 상황을 처리하는 대체 방법을 확인할 수 있습니다.
robots.txt 파일 이동
robots.txt처리하는 다른 방법을 준비하려면 자습서의 이 섹션에서 파일을 프로젝트에 포함되지 않은 폴더로 이동하고 스테이징 환경에서 robots.txt 삭제합니다. 파일을 해당 환경에 배포하는 새 방법이 제대로 작동하는지 확인할 수 있도록 준비에서 파일을 삭제해야 합니다.
솔루션 탐색기robots.txt파일을 마우스 오른쪽 단추 로 클릭하고 프로젝트에서 제외를 클릭합니다.
Windows 파일 탐색기 사용하여 솔루션 폴더에 새 폴더를 만들고 이름을 ExtraFiles로 지정합니다.
ContosoUniversity 프로젝트 폴더에서 ExtraFiles 폴더로 robots.txt 파일을 이동합니다.
FTP 도구를 사용하여 스테이징 웹 사이트에서 robots.txt 파일을 삭제합니다.
또는 스테이징 게시 프로필의 설정 탭에서 파일 게시 옵션 아래에서 대상에서 추가 파일 제거를 선택하고 스테이징에 다시 게시할 수 있습니다.
게시 프로필 파일 업데이트
스테이징에는 robots.txt 필요하므로 배포하기 위해 업데이트해야 하는 유일한 게시 프로필은 스테이징입니다.
Visual Studio에서 Staging.pubxml을 엽니다.
파일 끝에 닫는
</Project>
태그 앞에 다음 태그를 추가합니다.<Target Name="CustomCollectFiles"> <ItemGroup> <_CustomFiles Include="..\ExtraFiles\**\*" /> <FilesForPackagingFromProject Include="%(_CustomFiles.Identity)"> <DestinationRelativePath>%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath> </FilesForPackagingFromProject> </ItemGroup> </Target>
이 코드는 배포할 추가 파일을 수집하는 새 대상 을 만듭니다. 대상은 지정한 조건에 따라 MSBuild가 실행할 하나 이상의 작업으로 구성됩니다.
특성은
Include
파일을 찾을 폴더가 프로젝트 폴더와 동일한 수준에 있는 ExtraFiles임을 지정합니다. MSBuild는 해당 폴더에서 모든 파일을 수집하고 하위 폴더에서 재귀적으로 수집합니다(이중 별표는 재귀 하위 폴더를 지정함). 이 코드를 사용하면 ExtraFiles 폴더 내의 하위 폴더에 여러 파일과 파일을 배치할 수 있으며 모두 배포됩니다.요소는
DestinationRelativePath
ExtraFiles 폴더에 있는 것과 동일한 파일 및 폴더 구조에서 폴더와 파일을 대상 웹 사이트의 루트 폴더에 복사하도록 지정합니다. ExtraFiles 폴더 자체를DestinationRelativePath
복사하려는 경우 값은 ExtraFiles\%(RecursiveDir)%(Filename)%(Extension)입니다.파일 끝에 닫는
</Project>
태그 앞에 새 대상을 실행할 시기를 지정하는 다음 태그를 추가합니다.<PropertyGroup> <CopyAllFilesToSingleFolderForPackageDependsOn> CustomCollectFiles; $(CopyAllFilesToSingleFolderForPackageDependsOn); </CopyAllFilesToSingleFolderForPackageDependsOn> <CopyAllFilesToSingleFolderForMsdeployDependsOn> CustomCollectFiles; $(CopyAllFilesToSingleFolderForMsdeployDependsOn); </CopyAllFilesToSingleFolderForMsdeployDependsOn> </PropertyGroup>
이 코드를 사용하면 대상 폴더에 파일을 복사하는 대상이 실행될 때마다 새
CustomCollectFiles
대상이 실행됩니다. 게시 및 배포 패키지 만들기를 위한 별도의 대상이 있으며, 게시 대신 배포 패키지를 사용하여 배포하기로 결정한 경우 새 대상이 두 대상 모두에 삽입됩니다.이제 .pubxml 파일은 다음 예제와 같습니다.
<?xml version="1.0" encoding="utf-8"?> <!-- This file is used by the publish/package process of your Web project. You can customize the behavior of this process by editing this MSBuild file. In order to learn more about this please visit https://go.microsoft.com/fwlink/?LinkID=208121. --> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <WebPublishMethod>MSDeploy</WebPublishMethod> <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration> <LastUsedPlatform>Any CPU</LastUsedPlatform> <SiteUrlToLaunchAfterPublish>http://contosou-staging.azurewebsites.net</SiteUrlToLaunchAfterPublish> <ExcludeApp_Data>True</ExcludeApp_Data> <MSDeployServiceURL>waws-prod-bay-001.publish.azurewebsites.windows.net:443</MSDeployServiceURL> <DeployIisAppPath>contosou-staging</DeployIisAppPath> <RemoteSitePhysicalPath /> <SkipExtraFilesOnServer>False</SkipExtraFilesOnServer> <MSDeployPublishMethod>WMSVC</MSDeployPublishMethod> <UserName>$contosou-staging</UserName> <_SavePWD>True</_SavePWD> <PublishDatabaseSettings> <Objects xmlns=""> <ObjectGroup Name="SchoolContext" Order="1" Enabled="True"> <Destination Path="Data Source=tcp:sk0264hvc9.database.windows.net,1433;Initial Catalog=ContosoUniversity-staging;User ID=CU-staging-admin@sk0264hvc9;Password=" Name="Data Source=tcp:sk0264hvc9.database.windows.net,1433;Initial Catalog=ContosoUniversity-staging;User Id=CU-staging-admin@sk0264hvc9;Password=" /> <Object Type="DbCodeFirst"> <Source Path="DBMigration" DbContext="ContosoUniversity.DAL.SchoolContext, ContosoUniversity.DAL" MigrationConfiguration="ContosoUniversity.DAL.Migrations.Configuration, ContosoUniversity.DAL" Origin="Configuration" /> </Object> </ObjectGroup> <ObjectGroup Name="DefaultConnection" Order="2" Enabled="False"> <Destination Path="Data Source=tcp:sk0264hvc9.database.windows.net,1433;Initial Catalog=ContosoUniversity-staging;User ID=CU-staging-admin@sk0264hvc9;Password=" Name="Data Source=tcp:sk0264hvc9.database.windows.net,1433;Initial Catalog=ContosoUniversity-staging;User Id=CU-staging-admin@sk0264hvc9;Password=" /> <Object Type="DbDacFx"> <PreSource Path="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-ContosoUniversity.mdf;Initial Catalog=aspnet-ContosoUniversity;Integrated Security=True" includeData="False" /> <Source Path="$(IntermediateOutputPath)AutoScripts\DefaultConnection_IncrementalSchemaOnly.dacpac" dacpacAction="Deploy" /> </Object> <UpdateFrom Type="Web.Config"> <Source MatchValue="Data Source=(LocalDb)\v11.0;Integrated Security=SSPI;Initial Catalog=aspnet-ContosoUniversity;AttachDBFilename=|DataDirectory|\aspnet-ContosoUniversity.mdf" MatchAttributes="$(UpdateFromConnectionStringAttributes)" /> </UpdateFrom> <Object Type="DbFullSql" Enabled="False"> <Source Path="..\aspnet-data-prod.sql" Transacted="False" /> </Object> </ObjectGroup> </Objects> </PublishDatabaseSettings> <EnableMSDeployBackup>False</EnableMSDeployBackup> </PropertyGroup> <ItemGroup> <MSDeployParameterValue Include="$(DeployParameterPrefix)DefaultConnection-Web.config Connection String"> <ParameterValue>Data Source=tcp:sk0264hvc9.database.windows.net,1433;Initial Catalog=ContosoUniversity-staging;User Id=CU-staging-admin@sk0264hvc9;Password=</ParameterValue> </MSDeployParameterValue> <MSDeployParameterValue Include="$(DeployParameterPrefix)SchoolContext-Web.config Connection String"> <ParameterValue>Data Source=tcp:sk0264hvc9.database.windows.net,1433;Initial Catalog=ContosoUniversity-staging;User Id=CU-staging-admin@sk0264hvc9;Password=</ParameterValue> </MSDeployParameterValue> </ItemGroup> <Target Name="CustomCollectFiles"> <ItemGroup> <_CustomFiles Include="..\ExtraFiles\**\*" /> <FilesForPackagingFromProject Include="%(_CustomFiles.Identity)"> <DestinationRelativePath>%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath> </FilesForPackagingFromProject> </ItemGroup> </Target> <PropertyGroup> <CopyAllFilesToSingleFolderForPackageDependsOn> CustomCollectFiles; $(CopyAllFilesToSingleFolderForPackageDependsOn); </CopyAllFilesToSingleFolderForPackageDependsOn> <CopyAllFilesToSingleFolderForMsdeployDependsOn> CustomCollectFiles; $(CopyAllFilesToSingleFolderForMsdeployDependsOn); </CopyAllFilesToSingleFolderForMsdeployDependsOn> </PropertyGroup> </Project>
Staging.pubxml 파일을 저장하고 닫습니다.
스테이징에 게시
원클릭 게시 또는 명령줄을 사용하여 스테이징 프로필을 사용하여 애플리케이션을 게시합니다.
원클릭 게시를 사용하는 경우 미리 보기 창에서 robots.txt 복사되는지 확인할 수 있습니다. 그렇지 않으면 FTP 도구를 사용하여 배포 후robots.txt 파일이 웹 사이트의 루트 폴더에 있는지 확인합니다.
요약
그러면 타사 호스팅 공급자에 ASP.NET 웹 애플리케이션을 배포하는 방법에 대한 이 자습서 시리즈가 완료됩니다. 이 자습서에서 다루는 topics 대한 자세한 내용은 ASP.NET 배포 콘텐츠 맵을 참조하세요.
추가 정보
MSBuild 파일로 작업하는 방법을 알고 있는 경우 .pubxml 파일(프로필별 작업용) 또는 프로젝트 .wpp.targets 파일(모든 프로필에 적용되는 작업)에 코드를 작성하여 다른 많은 배포 작업을 자동화할 수 있습니다. .pubxml 및 .wpp.targets 파일에 대한 자세한 내용은 방법: 게시 프로필에서 배포 설정 편집(.pubxml) 파일 및 Visual Studio 웹 프로젝트의 .wpp.targets 파일을 참조하세요. MSBuild 코드에 대한 기본 소개는 엔터프라이즈 배포 시리즈의 프로젝트 파일 분석: 프로젝트 파일 이해를 참조하세요. MSBuild 파일을 사용하여 사용자 고유의 시나리오에 대한 작업을 수행하는 방법을 알아보려면 다음 책을 참조하세요. Microsoft Build Engine 내부: Sayed Ibraham Hashimi 및 William Bartholomew의 MSBuild 및 Team Foundation Build 사용.
감사의 말
이 자습서 시리즈의 콘텐츠에 중요한 기여 다음 사용자에게 감사드립니다.
- 알베르토 포블라시온, MVP & MCT, 스페인
- Jarod Ferguson, Data Platform Development MVP, 미국
- 가혹한 미탈, Microsoft
- 존 갤러웨이 (트위터: @jongalloway)
- 크리스티나 올슨, Microsoft
- Mike Pope, Microsoft
- Mohit Srivastava, Microsoft
- 라파엘레 리알디, 이탈리아
- Rick Anderson, Microsoft
- Sayed Hashimi, Microsoft(twitter: @sayedihashimi)
- 스콧 핸셀먼 (트위터: @shanselman)
- 스콧 헌터, 마이크로소프트 (트위터: @coolcsh)
- 스루안 보조비치, 세르비아
- 비샬 조시, 마이크로소프트 (트위터: @vishalrjoshi)