Jak publikować strony internetowe za pomocą msbuild?

Visual Studio 2010 posiada polecenie Publikuj, które pozwala opublikować projekt aplikacji internetowej w lokalizacji systemu plików. Chciałbym to zrobić na moim TeamCity build server, więc muszę to zrobić z solution runner lub msbuild. Próbowałem użyć celu Publish, ale myślę, że może to być dla ClickOnce: {]}

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

W zasadzie chcę zrobić dokładnie to, co projekt wdrażania sieci, ale bez dodatku. Potrzebuję go do skompilowania WAP, usunięcia zbędnych plików do wykonania wykonaj dowolne www.Config transformations , i skopiować wyjście do określonego miejsca.

Moje rozwiązanie, na podstawie odpowiedzi Jeffa Sivera

<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>
Author: Sayed Ibrahim Hashimi, 2010-06-22

11 answers

Mam go głównie działa bez niestandardowego skryptu msbuild. Oto odpowiednie ustawienia konfiguracji TeamCity build:

Artifact paths: %system.teamcity.build.workingDir%\MyProject\obj\Debug\Package\PackageTmp 
Type of runner: MSBuild (Runner for MSBuild files) 
Build file path: MyProject\MyProject.csproj 
Working directory: same as checkout directory 
MSBuild version: Microsoft .NET Framework 4.0 
MSBuild ToolsVersion: 4.0 
Run platform: x86 
Targets: Package 
Command line parameters to MSBuild.exe: /p:Configuration=Debug

To skompiluje, pakiet (z web.Config transformation) i zapisać wyjście jako artefakty. Jedyną rzeczą, której brakuje, jest skopiowanie wyjścia do określonej lokalizacji, ale można to zrobić albo w innej konfiguracji TeamCity build z zależnością od artefaktów, albo za pomocą skryptu msbuild.

Update

Oto msbuild skrypt, który się skompiluje, pakiet (z web.Config transformation), i skopiować wyjście na mój serwer staging

<?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>

Możesz także usunąć właściwości SolutionName i ProjectName z tagu PropertyGroup i przekazać je do msbuild.

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

Update 2

Ponieważ to pytanie wciąż ma duży ruch, pomyślałem, że warto zaktualizować moją odpowiedź z moim obecnym skryptem, który używa Web Deploy (znany również jako 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>

W TeamCity, mam parametry o nazwie env.Configuration, env.ProjectName i env.DeployServiceUrl. MSBuild runner posiada ścieżkę do pliku kompilacji, a parametry są przekazywane automatycznie (nie trzeba ich podawać w parametrach wiersza poleceń).

Można go również uruchomić z linii poleceń:

msbuild build.xml /p:Configuration=Staging;ProjectName=MyProject;DeployServiceUrl=http://staging-server/MSDeployAgentService
 137
Author: jrummell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-30 12:49:00

Używając profili wdrożeń wprowadzonych w VS 2012, możesz publikować za pomocą następującego wiersza poleceń:

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

Aby uzyskać więcej informacji na temat parametrów Zobacz ten .

Wartości parametru /p:VisualStudioVersion zależą od wersji programu Visual Studio. Wikipedia ma tabelę wydań Visual Studio i ich wersji .

 84
Author: Chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-04 10:01:18

Wymyśliłem takie rozwiązanie, działa dla mnie świetnie:

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

Tajnym sosem jest _wppcopywebapplication target.

 39
Author: Alexander Beletsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-02 18:59:20

Nie znam TeamCity, więc mam nadzieję, że ci się uda.

Najlepszy sposób, jaki znalazłem, to MSDeploy.exe. Jest to część projektu WebDeploy prowadzonego przez Microsoft. Możesz pobrać bity tutaj .

Z WebDeploy uruchamiasz wiersz poleceń

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

Robi to to samo co polecenie vs Publish, kopiując Tylko niezbędne bity do folderu deployment.

 28
Author: Jeff Siver,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-23 13:31:55

W VisualStudio 2012 istnieje sposób na obsługę subj bez publikowania profili. Możesz przekazać folder wyjściowy za pomocą parametrów. Działa zarówno ze ścieżką bezwzględną, jak i względną w parametrze 'publishUrl'. Możesz użyć VS100COMNTOOLS, jednak musisz nadpisać VisualStudioVersion, aby użyć docelowego 'WebPublish' z %ProgramFiles%\MSBuild\Microsoft\VisualStudio\v11.0\WebApplications\Microsoft.WebApplication.targets. Z VisualStudioVersion 10.0 ten skrypt powiedzie się bez wyjścia:)

Update: udało mi się użyć tej metody na serwerze kompilacji z Windows SDK 7.1 zainstalowane (brak Visual Studio 2010 i 2012 na maszynie). Ale musiałem wykonać te kroki, aby to działało:

  1. spraw, aby Windows SDK 7.1 był aktualny na komputerze za pomocą Simmo answer ( https://stackoverflow.com/a/2907056/2164198 )
  2. Ustawianie klucza rejestru HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ VisualStudio\SxS\VS7 \ 10.0 na "C:\Program pliki \ Microsoft Visual Studio 10.0\" (użyj odpowiedniej ścieżki)
  3. kopiowanie folderu % ProgramFiles%\MSBuild\Microsoft \ VisualStudio \ v11. 0 z mojej maszyny programisty do zbudowania serwera

Skrypt:

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%
 13
Author: Ivan Samygin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:02

Znaleziono dwa różne rozwiązania, które działały w nieco inny sposób:

1. Rozwiązanie to inspirowane jest odpowiedzią alexanderb [link] . Niestety nie udało się nam - niektóre dll nie zostały skopiowane do OutDir. Okazało się, że zamiana ResolveReferences na Build rozwiązuje problem - teraz wszystkie niezbędne pliki są kopiowane do lokalizacji OutDir.

msbuild /target:Build;_WPPCopyWebApplication  /p:Configuration=Release;OutDir=C:\Tmp\myApp\ MyApp.csproj
Wadą tego rozwiązania był fakt, że OutDir zawierał nie tylko pliki dla publikuj.

2. Pierwsze rozwiązanie działa dobrze, ale nie tak, jak się spodziewaliśmy. Chcieliśmy mieć funkcjonalność publikowania tak, jak jest w Visual Studio IDE - tzn. tylko pliki, które powinny być opublikowane, będą kopiowane do katalogu wyjściowego. Jak już wspomniano pierwsze rozwiązanie kopiuje znacznie więcej plików do OutDir - strona do publikowania jest następnie przechowywana w podfolderze _PublishedWebsites/{ProjectName}. Poniższe polecenie rozwiązuje ten problem - tylko pliki do publikacji zostaną skopiowane do wybranego folderu. Więc teraz masz katalog, który można bezpośrednio opublikować - w porównaniu z pierwszym rozwiązaniem zaoszczędzisz trochę miejsca na dysku twardym.

msbuild /target:Build;PipelinePreDeployCopyAllFilesToOneFolder /p:Configuration=Release;_PackageTempDir=C:\Tmp\myApp\;AutoParameterizationWebConfigConnectionStrings=false MyApp.csproj
AutoParameterizationWebConfigConnectionStrings=false parametr gwarantuje, że łańcuchy połączeń nie będą traktowane jako specjalne artefakty i zostaną poprawnie wygenerowane - więcej informacji można znaleźć w link .
 12
Author: Pavel Cermak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:32

Musisz ustawić swoje środowisko

I odwołaj się do mojego bloga.(sorry post was Korean)

  • 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
    
 3
Author: Kim Ki Won,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-03 16:22:49

To mój plik wsadowy

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
 1
Author: Alim İŞÇİ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-05 15:05:51

To moja partia robocza

Publikuj-moja-strona.bat

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%

Zauważ, że zainstalowałem Visual Studio na serwerze, aby móc uruchomić MsBuild.exe, ponieważ foldery MsBuild.exe W.Net Framework nie działają.

 1
Author: Alper Ebicoglu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-14 13:30:11

Do generowania wyjścia publish podaj jeszcze jeden parametr. przykład msbuild.sln /P:publisprofile=profilename /p:deployonbuild=true /p:configuration=debug/or any

 1
Author: Yashwant Mahawar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-17 04:36:19

Możesz opublikować rozwiązanie z żądaną ścieżką za pomocą poniższego kodu, tutaj PublishInDFolder jest nazwą, która ma ścieżkę, w której musimy ją opublikować (musimy ją utworzyć na poniższym obrazku)

Możesz utworzyć plik publikowania w ten sposób

Dodaj poniżej 2 linijki kodu w pliku wsadowym(.bat)

@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
 1
Author: pradeep s.k,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-23 07:35:00