MSBuild.exe를 사용하여 cmd 줄이있는 ASP.NET MVC 4 프로젝트 "게시"


82

MSBuild.exeMVC 4 프로젝트를 가져 와서 지정된 디렉토리에 게시하는에 대해 실행할 명령을 찾고 있습니다.

예를 들면

MSBuild <solution>/<project>.csproj -publish -output=c:/folder

이것은 분명히 잘못된 구문입니다. 나는 내 질문을 단순화하려고 노력하고 있습니다.

이 질문 은 빌드 XML에 대해 이야기하지만 그 정도의 세부 사항으로 아무것도하지 않으려 고합니다.

나는 단순히 배포를 시도하고 있습니다.

이 질문 에서 더 아래로 누군가 "MSDeploy"에 대해 말합니다. 내가 조사 할 수는 있지만 유일한 옵션입니까? 서버에 웹 배포를 설치할 수 없습니다. 이 경우 내가 정말로해야 할 일은 "게시"하고 게시 된 프로젝트의 내용을 서버 / 파일 시스템의 지정된 디렉토리로 보내는 것입니다.

누구든지 내가 사용할 수있는 하나의 라이너가 있습니까?

MSDeploy를 사용해야합니까?

MSDeploy를 사용하려면 서버에 웹 배포를 설치해야합니까?

서버에서 웹 배포를 설정하려면 일부 포트와 권한을 설정하고 일부 IIS 추가 기능을 설치해야하지 않습니까?

나는 단순한 것을 실행하고 싶다.

답변:


152

VS 2012 ( VS 2010 용 Azure SDK 에서 제공되는 게시 업데이트 포함 )에서는 웹 프로젝트에 대한 명령 줄 게시를 단순화했습니다. 프로필 게시를 사용하여이를 수행했습니다.

웹 프로젝트 용 VS에서 게시 대화 상자를 사용하여 게시 프로필을 만들 수 있습니다. 해당 프로필을 만들면 Properties \ PublishProfiles 아래의 프로젝트에 자동으로 저장됩니다. 생성 된 프로필을 사용하여 다음 명령 줄을 통해 명령 줄에서 게시 할 수 있습니다.

msbuild mysln.sln /p:DeployOnBuild=true /p:PublishProfile=<profile-name>

게시 프로필 (.pubxml 파일)을 다른 위치에 저장하려는 경우 PublishProfile 경로를 전달할 수 있습니다.

게시 프로필은 MSBuild 파일입니다. 게시 프로세스를 사용자 지정해야하는 경우 .pubxml 파일 내에서 직접 수행 할 수 있습니다.

최종 목표가 명령 줄에서 속성을 전달하는 것입니다. 다음을 추천합니다. VS에서 샘플 게시 프로필을 만듭니다. 해당 게시 프로필을 검사하여 명령 줄에서 전달해야하는 MSBuild 속성을 결정합니다. 참고로 모든 게시 방법이 명령 줄 게시 (예 : FTP / FPSE)를 지원하지는 않습니다.

참고로 .sln 대신 .csproj / .vbproj를 빌드하고 VS 2012를 사용하는 경우 /p:VisualStudioVersion=11.0. 이유에 대한 자세한 내용은 http://sedodream.com/2012/08/19/VisualStudioProjectCompatabilityAndVisualStudioVersion.aspx를 참조 하십시오 .


3
나는 OP가 단순히 그의 로컬 컴퓨터의 임의의 폴더에 웹 앱을 "배포"하기를 원한다고 생각합니다.
Richard Szalay 2012

3
그래서 배포 서버에서 사용자가 Visual Studios IDE를 설치하여 이와 같은 명령이 작동하도록해야합니까?
Erik5388

2
또는 그냥 할 수 있습니다 : microsoft.com/en-us/download/details.aspx?id=30670
Erik5388

10
VS 2013에서 작동합니까? 동일한 명령 줄을 실행하면 게시가 생성되지 않습니다. 오류도 없습니다. 게시 프로필에서 간단한 파일 시스템 배포로 테스트합니다. 작품을 구축하면 게시 결과가 없습니다. 목적지가 비어 있습니다.
Rex Whitten 2014

2
내가 이것을 사용하는 경우는 발행 내 디버그 빌드합니다 .pubxml 파일이있는 경우에도 <LastUsedBuildConfiguration> 릴리스 </ LastUsedBuildConfiguration>
reggaeguitar

11

아래와 같은 build.xml 파일을 만듭니다.

Visual Studio 명령 프롬프트 시작

msbuild build.xml 실행

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0" DefaultTargets="Build">

  <PropertyGroup>
    <Build>$(MSBuildProjectDirectory)\Build</Build>
    <ProjectFile>MyProject.csproj</ProjectFile> 
    <ProjectName>MyProjectNameInVisualStudio</ProjectName>
    <CopyTo>$(MSBuildProjectDirectory)\CopyTo</CopyTo>
  </PropertyGroup> 

  <Target Name="Build"> 
    <RemoveDir Directories="$(Build)"/>  
    <MSBuild Projects="$(ProjectFile)" Properties="Configuration=Release;OutputPath=$(Build);OutDir=$(Build)/"></MSBuild>  
    <Exec Command="robocopy.exe  $(Build)\_PublishedWebsites\$(ProjectName) $(CopyTo) /e /is
      if %errorlevel% leq 4 exit 0 else exit %errorlevel%"/>    
  </Target>

</Project>

7
이 답변은 저에게 매우 도움이되었지만 개선하기 위해 추가 할 한 가지가 있습니다. 작성된대로 실행하면 robocopy는 성공적인 복사를 나타 내기 위해 종료 코드 1을 반환하여 msbuild가 빌드가 실패했다고 생각하게합니다. 이 문제를 해결하려면 robocopy 명령의 / e 뒤에 "if % errorlevel % leq 1 exit 0 else exit % errorlevel %"을 추가하면됩니다.
Alex

위의 답변과 Alex의 의견 모두 도움이되었습니다. 또한 </ Target> 앞에 <RemoveDir Directories = "$ (CopyTo)"/>를 추가하여 프로젝트 폴더를 깨끗하게 유지합니다.
JackArbiter

6

아래 명령은 완벽하게 작동합니다.

msbuild Myproject.sln  /t:Rebuild /p:outdir="c:\outproject\\" /p:Configuration=Release /p:Platform="Any CPU"

3
콘텐츠 파일을 게시하고 싶을 때 작동합니다. 그러나 Web.config의 변환은 실행되지 않습니다
안드레아스

1
이 방법은 MVC 웹 사이트를 게시 작동하지 않습니다 (보기는 복사되지 않습니다)
eka808

Web API와 같은 웹 응용 프로그램의 경우 bin 폴더에 App_global.asax.dll 및 App_global.asax.compiled라는 두 개의 중요한 파일이 생성되지 않습니다. 위의 Sayed 예제를 사용하는 것이 좋습니다.
Fred Peters

1

대답은 기본 구성 즉 디버그를 배포하는 것이라고 말했습니다. 게시 프로필에서 선택한 구성이 MSBuild에서 무시되는 것 같습니다. 따라서 배포에 대한 올바른 구성을 지정하도록 명령을 변경했습니다.

msbuild mysln.sln /p:Configuration=[config-name] /p:DeployOnBuild=true /p:PublishProfile=[profile-name]

여기서 config-name = 릴리스 또는 생성 한 다른 빌드 구성


0

웹 프로젝트를 사용하면 위와 같이 빌드해야하지만 패키지 / 복사도 필요합니다. 우리는 "게시"가 아닌 파일 사본을 사용합니다.

또한; 웹 사이트 구축을 위해 DEBUG / RELEASE를 사용합니다. 그러나 실제 환경, 즉 "QA"또는 "PROD"는 web.config 변환을 처리합니다.

따라서 처음에는 RELEASE를 사용하여 빌드 한 다음 QA를 사용하여 패키지화합니다 (아래 예제 참조).

  <PropertyGroup>   
    <SolutionName>XXX.Website</SolutionName>
    <ProjectName>XXX.Website</ProjectName>
    <IisFolderName>XXX</IisFolderName>

    <SolutionConfiguration>QA</SolutionConfiguration> <!--Configuration will be set based on user selection-->   

    <SolutionDir>$(MSBuildThisFileDirectory)..</SolutionDir>
    <OutputLocation>$(SolutionDir)\bin\</OutputLocation>
     <WebServer>mywebserver.com</WebServer>
  </PropertyGroup>

  <Target Name="BuildPackage">
    <MSBuild Projects="$(SolutionDir)\$(SolutionName).sln" ContinueOnError="false" Targets="Clean;Rebuild" Properties="Configuration=Release" />
    <MSBuild Projects="$(SolutionDir)\$(ProjectName)\$(ProjectName).csproj" ContinueOnError="false" Targets="Package" Properties="Configuration=$(SolutionConfiguration);AutoParameterizationWebConfigConnectionStrings=False" />
  </Target>

  <Target Name="CopyOutput">
    <ItemGroup>
      <PackagedFiles Include="$(SolutionDir)\$(ProjectName)\obj\$(SolutionConfiguration)\Package\PackageTmp\**\*.*"/>
    </ItemGroup>
    <Copy SourceFiles="@(PackagedFiles)" DestinationFiles="@(PackagedFiles->'\\$(WebServer)\$(IisFolderName)\$(SolutionConfiguration)\%(RecursiveDir)%(Filename)%(Extension)')"/>
  </Target>

그래서;

  1. 속성 설정
  2. BuildPackage 대상 호출
  3. CopyOutput 대상을 호출하고 짜잔!
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.