programing

msbuild로 웹을 게시하는 방법?

bestprogram 2023. 5. 2. 23:04

msbuild로 웹을 게시하는 방법?

Visual Studio 2010에는 웹 응용 프로그램 프로젝트를 파일 시스템 위치에 게시할 수 있는 게시 명령이 있습니다.TeamCity 빌드 서버에서 이 작업을 수행하고 싶기 때문에 솔루션 runner 또는 msbuild로 수행해야 합니다.게시 대상을 사용하려고 했지만, ClickOnce:

msbuild Project.csproj /t:Publish /p:Configuration=Deploy

기본적으로 웹 배포 프로젝트가 수행하는 것과 동일한 작업을 수행하지만 추가 기능은 사용하지 않습니다.WAP를 컴파일하고, 실행에 불필요한 파일을 제거하고, web.config 변환을 수행하고, 출력을 지정된 위치에 복사하는 데 필요합니다.

Jeff Siver의 답변을 기반으로 한 My Solution

<Target Name="Deploy">
    <MSBuild Projects="$(SolutionFile)" 
             Properties="Configuration=$(Configuration);DeployOnBuild=true;DeployTarget=Package" 
             ContinueOnError="false" />
    <Exec Command="&quot;$(ProjectPath)\obj\$(Configuration)\Package\$(ProjectName).deploy.cmd&quot; /y /m:$(DeployServer) -enableRule:DoNotDeleteRule" 
          ContinueOnError="false" />
</Target>

커스텀 msbuild 스크립트 없이 대부분 작동하게 되었습니다.다음은 관련 TeamCity 빌드 구성 설정입니다.

아티팩트 경로: %system.팀 시티build.workingDir%\MyProject\obj\Debug\Package\패키지 Tmp실행자 유형: MSBuild(MSBuild 파일의 실행자)빌드 파일 경로: MyProject\MyProject.csproj작업 디렉토리: 체크아웃 디렉토리와 동일MSBuild 버전:마이크로소프트사NET Framework 4.0MS 빌드 도구 버전: 4.0실행 플랫폼: x86대상: 패키지MSBuild.exe에 대한 명령줄 매개 변수: /p:Configuration=Discovery

그러면 web.config 변환을 사용하여 컴파일하고 패키지화한 다음 출력을 아티팩트로 저장합니다.누락된 유일한 것은 출력을 지정된 위치에 복사하는 것이지만 아티팩트 종속성이 있는 다른 TeamCity 빌드 구성이나 msbuild 스크립트에서 수행할 수 있습니다.

갱신하다

다음은 web.config 변환을 사용하여 출력을 컴파일하고 패키지화한 후 내 스테이징 서버에 복사할 msbuild 스크립트입니다.

<?xml version="1.0" encoding="utf-8" ?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
        <SolutionName>MySolution</SolutionName>
        <SolutionFile>$(SolutionName).sln</SolutionFile>
        <ProjectName>MyProject</ProjectName>
        <ProjectFile>$(ProjectName)\$(ProjectName).csproj</ProjectFile>
    </PropertyGroup>

    <Target Name="Build" DependsOnTargets="BuildPackage;CopyOutput" />

    <Target Name="BuildPackage">
        <MSBuild Projects="$(SolutionFile)" ContinueOnError="false" Targets="Rebuild" Properties="Configuration=$(Configuration)" />
        <MSBuild Projects="$(ProjectFile)" ContinueOnError="false" Targets="Package" Properties="Configuration=$(Configuration)" />
    </Target>

    <Target Name="CopyOutput">
        <ItemGroup>
            <PackagedFiles Include="$(ProjectName)\obj\$(Configuration)\Package\PackageTmp\**\*.*"/>
        </ItemGroup>
        <Copy SourceFiles="@(PackagedFiles)" DestinationFiles="@(PackagedFiles->'\\build02\wwwroot\$(ProjectName)\$(Configuration)\%(RecursiveDir)%(Filename)%(Extension)')"/>
    </Target>
</Project>

또한 PropertyGroup 태그에서 SolutionName 및 ProjectName 속성을 제거하고 tomsbuild로 전달할 수 있습니다.

msbuild build.xml /p:Configuration=Deploy;SolutionName=MySolution;ProjectName=MyProject

업데이트 2

이 질문은 여전히 많은 트래픽을 받기 때문에 Web Deploy(MSDeploy라고도 함)를 사용하는 현재 스크립트로 답변을 업데이트할 가치가 있다고 생각했습니다.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build" ToolsVersion="4.0">
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
    <ProjectFile Condition=" '$(ProjectFile)' == '' ">$(ProjectName)\$(ProjectName).csproj</ProjectFile>
    <DeployServiceUrl Condition=" '$(DeployServiceUrl)' == '' ">http://staging-server/MSDeployAgentService</DeployServiceUrl>
  </PropertyGroup>

  <Target Name="VerifyProperties">
    <!-- Verify that we have values for all required properties -->
    <Error Condition=" '$(ProjectName)' == '' " Text="ProjectName is required." />
  </Target>

  <Target Name="Build" DependsOnTargets="VerifyProperties">
    <!-- Deploy using windows authentication -->
    <MSBuild Projects="$(ProjectFile)"
             Properties="Configuration=$(Configuration);
                             MvcBuildViews=False;
                             DeployOnBuild=true;
                             DeployTarget=MSDeployPublish;
                             CreatePackageOnPublish=True;
                             AllowUntrustedCertificate=True;
                             MSDeployPublishMethod=RemoteAgent;
                             MsDeployServiceUrl=$(DeployServiceUrl);
                             SkipExtraFilesOnServer=True;
                             UserName=;
                             Password=;"
             ContinueOnError="false" />
  </Target>
</Project>

TeamCity라는 매개 .env.Configuration,env.ProjectName그리고.env.DeployServiceUrlMSBuild 실행자는 빌드 파일 경로를 가지고 있으며 매개 변수는 자동으로 전달됩니다(명령줄 매개 변수에 지정할 필요는 없음).

명령줄에서 실행할 수도 있습니다.

msbuild build.xml /p:Configuration=Staging;ProjectName=MyProject;DeployServiceUrl=http://staging-server/MSDeployAgentService

VS 2012에 소개된 배포 프로파일을 사용하여 다음 명령줄을 사용하여 게시할 수 있습니다.

msbuild MyProject.csproj /p:DeployOnBuild=true /p:PublishProfile=<profile-name> /p:Password=<insert-password> /p:VisualStudioVersion=11.0

매개 변수에 대한 자세한 내용은 이 항목을 참조하십시오.

에 값/p:VisualStudioVersion매개 변수는 사용 중인 Visual Studio 버전에 따라 다릅니다.Wikipedia에는 Visual Studio 릴리스버전 표가 있습니다.

저는 이러한 해결책을 생각해냈고, 저에게 매우 효과적입니다.

msbuild /t:ResolveReferences;_WPPCopyWebApplication /p:BuildingProject=true;OutDir=C:\Temp\build\ Test.csproj

비밀 소스는 _WPPCopyWebApplication target입니다.

저는 팀시티를 잘 모르기 때문에 이것이 당신에게 도움이 되길 바랍니다.

이를 위한 가장 좋은 방법은 MSDeploy.exe입니다.이것은 Microsoft에서 실행하는 WebDeploy 프로젝트의 일부입니다.여기에서 비트를 다운로드할 수 있습니다.

WebDeploy를 사용하여 명령줄을 실행합니다.

msdeploy.exe -verb:sync -source:contentPath=c:\webApp -dest:contentPath=c:\DeployedWebApp

이는 VS 게시 명령과 동일한 작업을 수행하여 필요한 비트만 배포 폴더에 복사합니다.

Visual Studio 2012에는 게시 프로필 없이 subj를 처리할 수 있는 방법이 있습니다.매개 변수를 사용하여 출력 폴더를 전달할 수 있습니다. parameter.publishUrl 경로 합니다.사용할 수 VS100COMNTOOLS의 대상 을(를) .%ProgramFiles%\MSBuild\Microsoft\VisualStudio\v11.0\WebApplications\Microsoft.WebApplication.targetsVisual 10하면 이 출력 합니다. :) Visual Studio Version 10.0은 과 같습니다. :)

업데이트: Windows SDK 7.1만 설치된 빌드 서버에서 이 방법을 사용할 수 있었습니다(기계에는 Visual Studio 2010 및 2012가 없음).하지만 저는 그것이 작동하도록 하기 위해 다음과 같은 단계를 따라야 했습니다.

  1. Simmo answer(https://stackoverflow.com/a/2907056/2164198) 를 사용하여 시스템에서 Windows SDK 7.1을 최신 상태로 만듭니다.
  2. 레지스트리 키 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\를 설정하는 중SxS\VS7\10.0 ~ "C:\Program Files\Microsoft Visual Studio 10.0\"(경로 사용)
  3. %ProgramFiles% 폴더 복사 중\개발자 컴퓨터에서 빌드 서버로 MSBuild\Microsoft\VisualStudio\v11.0

스크립트:

set WORK_DIR=%~dp0
pushd %WORK_DIR%
set OUTPUTS=%WORK_DIR%..\Outputs
set CONFIG=%~1
if "%CONFIG%"=="" set CONFIG=Release
set VSTOOLS="%VS100COMNTOOLS%"
if %VSTOOLS%=="" set "PATH=%PATH%;%WINDIR%\Microsoft.NET\Framework\v4.0.30319" && goto skipvsinit
call "%VSTOOLS:~1,-1%vsvars32.bat"
if errorlevel 1 goto end
:skipvsinit
msbuild.exe Project.csproj /t:WebPublish /p:Configuration=%CONFIG% /p:VisualStudioVersion=11.0 /p:WebPublishMethod=FileSystem /p:publishUrl=%OUTPUTS%\Project
if errorlevel 1 goto end
:end
popd
exit /b %ERRORLEVEL%

약간 다른 방식으로 작동하는 두 가지 다른 솔루션을 찾았습니다.

이 솔루션은 allexanderb [link]의 답변에서 영감을 얻었습니다.불행하게도 그것은 우리에게 효과가 없었습니다. 일부 DLL은 OutDir에 복사되지 않았습니다.우리는 대체가ResolveReferences와 함께Build합니다. 위치target에 복사됩니다. 이제 필요한 모든 파일이 OutDir 위치에 복사됩니다.

msbuild/target:빌드;_WPPCopyWebApplication /p:Configuration=Release;OutDir=C:\Tmp\myApp\MyApp.csproj
Disadvantage of this solution was the fact that OutDir contained not only files for publish.

첫 번째 솔루션은 잘 작동하지만 우리가 예상했던 것과는 다릅니다.Visual Studio IDE에 있는 것처럼 게시 기능을 사용하고자 했습니다. 즉, 게시해야 할 파일만 출력 디렉터리에 복사됩니다.이미 언급했듯이, 첫 번째 솔루션은 훨씬 더 많은 파일을 OutDir에 복사합니다. 그러면 게시용 웹 사이트가 다음에 저장됩니다._PublishedWebsites/{ProjectName}하위 폴더.다음 명령은 이 문제를 해결합니다. 게시할 파일만 원하는 폴더에 복사됩니다.이제 직접 게시할 수 있는 디렉터리가 생겼습니다. 첫 번째 솔루션과 비교하면 하드 드라이브의 공간을 절약할 수 있습니다.

msbuild/target:빌드;PipelinePreDeploy모든 파일을 하나의 폴더에 복사 /p:Configuration=Release;_패키지TempDir=C:\Tmp\myApp\;자동 매개 변수화 WebConfigConnectionStrings=false MyApp.csproj
AutoParameterizationWebConfigConnectionStrings=false parameter will guarantee that connection strings will not be handled as special artifacts and will be correctly generated - for more information see 링크.

이것은 나의 작업 배치입니다.

나의 책을 출판합니다.박쥐

SET MSBUILD_PATH="C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin"
SET PUBLISH_DIRECTORY="C:\MyWebsitePublished"
SET PROJECT="D:\Github\MyWebSite.csproj"


cd /d %MSBUILD_PATH%
MSBuild %PROJECT%  /p:DeployOnBuild=True /p:DeployDefaultTarget=WebPublish /p:WebPublishMethod=FileSystem /p:DeleteExistingFiles=True /p:publishUrl=%PUBLISH_DIRECTORY%

Visual Studio를 실행할 수 있도록 서버에 설치했습니다.MsBuild.exe왜냐하면MsBuild.exe.Net Framework 폴더가 작동하지 않습니다.

환경을 설정해야 합니다.

  • < 웹사이트 이름>
  • < 도메인>

그리고 제 블로그를 참조하세요. (죄송한 게시물은 한국어였습니다.)

  • http://xyz37.blog.me/50124665657
  • http://blog.naver.com/PostSearchList.nhn?SearchText=webdeploy&blogId=xyz37&x=25&y=7

    @ECHO OFF
    :: http://stackoverflow.com/questions/5598668/valid-parameters-for-msdeploy-via-msbuild
    ::-DeployOnBuild -True
    :: -False
    :: 
    ::-DeployTarget -MsDeployPublish
    :: -Package
    :: 
    ::-Configuration -Name of a valid solution configuration
    :: 
    ::-CreatePackageOnPublish -True
    :: -False
    :: 
    ::-DeployIisAppPath -<Web Site Name>/<Folder>
    :: 
    ::-MsDeployServiceUrl -Location of MSDeploy installation you want to use
    :: 
    ::-MsDeployPublishMethod -WMSVC (Web Management Service)
    :: -RemoteAgent
    :: 
    ::-AllowUntrustedCertificate (used with self-signed SSL certificates) -True
    :: -False
    :: 
    ::-UserName
    ::-Password
    SETLOCAL
    
    IF EXIST "%SystemRoot%\Microsoft.NET\Framework\v2.0.50727" SET FXPath="%SystemRoot%\Microsoft.NET\Framework\v2.0.50727"
    IF EXIST "%SystemRoot%\Microsoft.NET\Framework\v3.5" SET FXPath="%SystemRoot%\Microsoft.NET\Framework\v3.5"
    IF EXIST "%SystemRoot%\Microsoft.NET\Framework\v4.0.30319" SET FXPath="%SystemRoot%\Microsoft.NET\Framework\v4.0.30319"
    
    SET targetFile=<web site fullPath ie. .\trunk\WebServer\WebServer.csproj
    SET configuration=Release
    SET msDeployServiceUrl=https://<domain>:8172/MsDeploy.axd
    SET msDeploySite="<WebSite name>"
    SET userName="WebDeploy"
    SET password=%USERNAME%
    SET platform=AnyCPU
    SET msbuild=%FXPath%\MSBuild.exe /MaxCpuCount:%NUMBER_OF_PROCESSORS% /clp:ShowCommandLine
    
    %MSBuild% %targetFile% /p:configuration=%configuration%;Platform=%platform% /p:DeployOnBuild=True /p:DeployTarget=MsDeployPublish /p:CreatePackageOnPublish=False /p:DeployIISAppPath=%msDeploySite% /p:MSDeployPublishMethod=WMSVC /p:MsDeployServiceUrl=%msDeployServiceUrl% /p:AllowUntrustedCertificate=True /p:UserName=%USERNAME% /p:Password=%password% /p:SkipExtraFilesOnServer=True /p:VisualStudioVersion=12.0
    
    IF NOT "%ERRORLEVEL%"=="0" PAUSE 
    ENDLOCAL
    

아래 코드, 여기 게시인을 기준으로 원하는 경로로 솔루션을 게시할 수 있습니다.D 폴더는 게시해야 할 경로가 있는 이름입니다(아래 사진에서 이 폴더를 만들어야 합니다).

다음과 같은 게시 파일을 만들 수 있습니다.

배치 파일(.bat)에서 코드 2줄 아래 추가

@echo OFF 
call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\Tools\VsMSBuildCmd.bat"
MSBuild.exe  D:\\Solution\\DataLink.sln /p:DeployOnBuild=true /p:PublishProfile=PublishInDFolder
pause

내 배치 파일입니다.

C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe C:\Projects\testPublish\testPublish.csproj  /p:DeployOnBuild=true /property:Configuration=Release
if exist "C:\PublishDirectory" rd /q /s "C:\PublishDirectory"
C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe -v / -p C:\Projects\testPublish\obj\Release\Package\PackageTmp -c C:\PublishDirectory
cd C:\PublishDirectory\bin 
del *.xml
del *.pdb

게시 출력을 생성하려면 매개 변수를 하나 더 제공하십시오. msbuild example.sln /p:sln /p:slprofile=profilename /p:deploy onbuild=true /p:configuration=profile/ 또는 any

이 명령을 사용하여 프로필 게시로 웹 응용프로그램을 게시할 수 있습니다.

msbuild SolutionName.sln /p:DeployOnBuild=true /p:PublishProfile=PublishProfileName

이 샘플 게시 프로파일은 네트워크 경로의 AssemblyInfo.cs 파일에 있는 버전 번호로 릴리스 zip 파일을 만들 수 있습니다(PowerShell 명령을 사용하여 zip 파일을 만들고 다른 게시 파일을 제거하는 것은 선택 사항임).

 <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
     <PropertyGroup>
    <WebPublishMethod>FileSystem</WebPublishMethod>
    <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
    <LastUsedPlatform>Any CPU</LastUsedPlatform>
    <SiteUrlToLaunchAfterPublish />
    <LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>
    <ExcludeApp_Data>False</ExcludeApp_Data>
    <Major>0</Major>
    <Minor>1</Minor>
    <Build>2</Build>
    <Publish>C:\</Publish>
    <publishUrl>$(Publish)</publishUrl>
    <DeleteExistingFiles>True</DeleteExistingFiles>
  </PropertyGroup>
  <Target Name="GetBuildUrl">
    <PropertyGroup>      <In>$([System.IO.File]::ReadAllText('$(MSBuildProjectDirectory)\Properties\AssemblyInfo.cs'))</In>
      <TargetPath>\\NetworkPath\ProjectName</TargetPath>
      <Pattern>^\s*\[assembly: AssemblyVersion\(\D*(\d+)\.(\d+)\.(\d+)\.(\d+)</Pattern>
      <Major>$([System.Text.RegularExpressions.Regex]::Match($(In), $(Pattern), System.Text.RegularExpressions.RegexOptions.Multiline).Groups[1].Value)</Major>
      <Minor>$([System.Text.RegularExpressions.Regex]::Match($(In), $(Pattern), System.Text.RegularExpressions.RegexOptions.Multiline).Groups[2].Value)</Minor>
      <Build>$([System.Text.RegularExpressions.Regex]::Match($(In), $(Pattern), System.Text.RegularExpressions.RegexOptions.Multiline).Groups[3].Value)</Build>
      <Sub>$([System.Text.RegularExpressions.Regex]::Match($(In), $(Pattern), System.Text.RegularExpressions.RegexOptions.Multiline).Groups[4].Value)</Sub>
      <Publish>$(TargetPath)\$(Major).$(Minor).$(Build).$(Sub)\</Publish>
      <publishUrl Condition=" '$(Publish)' != '' ">$(Publish)</publishUrl>
      <publishUrl Condition=" '$(Publish)' == '' and '$(LastUsedBuildConfiguration)'!='' ">$(LastUsedBuildConfiguration)</publishUrl>
    </PropertyGroup>
  </Target>
  <Target Name="BeforeBuild" DependsOnTargets="GetBuildUrl">
    <Message Importance="High" Text="|" />
    <Message Importance="High" Text=" ================================================================================================" />
    <Message Importance="High" Text="    BUILD INFO                                                                                    " />
    <Message Importance="High" Text="    Version [$(Major).$(Minor).$(Build)] found in [$(MSBuildProjectDirectory)\Properties\AssemblyInfo.cs] " />
    <Message Importance="High" Text="    Build will be saved to [$(publishUrl)]                                                        " />
    <Message Importance="High" Text=" =================================================================================================" />
    <Message Importance="High" Text="|" />
  </Target>
  <Target Name="Zip" BeforeTargets="AfterBuild">
    <Exec Command="PowerShell -command Compress-Archive -Path $(Publish) -DestinationPath $(Publish)Release.zip" />
    <Exec Command="PowerShell -command Remove-Item -Recurse -Force $(Publish) -Exclude Release.zip" />
  </Target>
</Project>

언급URL : https://stackoverflow.com/questions/3097489/how-to-publish-web-with-msbuild