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=""$(ProjectPath)\obj\$(Configuration)\Package\$(ProjectName).deploy.cmd" /y /m:$(DeployServer) -enableRule:DoNotDeleteRule"
ContinueOnError="false" />
</Target>
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
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 .
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.
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.
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:
- spraw, aby Windows SDK 7.1 był aktualny na komputerze za pomocą Simmo answer ( https://stackoverflow.com/a/2907056/2164198 )
- 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)
- 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%
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.csprojWadą 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 .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
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
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ą.
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
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
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