Visual Studio 2010 ma polecenie Publikuj, które pozwala opublikować projekt aplikacji sieci Web w lokalizacji systemu plików. Chciałbym to zrobić na moim serwerze kompilacji TeamCity, więc muszę to zrobić za pomocą narzędzia do uruchamiania rozwiązań lub msbuild. Próbowałem użyć celu publikowania, ale myślę, że może to być dla ClickOnce:
msbuild Project.csproj /t:Publish /p:Configuration=Deploy
Zasadniczo chcę robić dokładnie to, co robi projekt wdrożenia internetowego, ale bez dodatku. Potrzebuję go do skompilowania WAP, usunięcia niepotrzebnych plików do wykonania, wykonania transformacji web.config i skopiowania danych wyjściowych do określonej lokalizacji.
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>
Odpowiedzi:
Mam to głównie działa bez niestandardowego skryptu msbuild. Oto odpowiednie ustawienia konfiguracji kompilacji TeamCity:
Spowoduje to skompilowanie, spakowanie (z transformacją web.config) i zapisanie danych wyjściowych jako artefaktów. Brakuje tylko kopiowania danych wyjściowych do określonej lokalizacji, ale można to zrobić w innej konfiguracji kompilacji TeamCity z zależnością od artefaktów lub za pomocą skryptu msbuild.
Aktualizacja
Oto skrypt msbuild, który skompiluje, spakuje (z transformacją web.config) i skopiuje dane wyjściowe na mój serwer pomostowy
Można również usunąć właściwości SolutionName i ProjectName ze znacznika PropertyGroup i przekazać je do msbuild.
Aktualizacja 2
Ponieważ to pytanie wciąż generuje duży ruch, pomyślałem, że warto zaktualizować swoją odpowiedź za pomocą mojego obecnego skryptu, który używa Web Deploy (znanego również jako MSDeploy).
W TeamCity, mam parametrów nazwanych
env.Configuration
,env.ProjectName
aenv.DeployServiceUrl
. Program uruchamiający MSBuild ma ścieżkę pliku kompilacji, a parametry są przekazywane automatycznie (nie trzeba ich określać w parametrach wiersza poleceń).Możesz również uruchomić go z wiersza poleceń:
źródło
Package
cel zależy również od WebDeploy:error : Package/Publish task Microsoft.Web.Publishing.Tasks.IsCleanMSDeployPackageNeeded failed to load Web Deploy assemblies. Microsoft Web Deploy is not correctly installed on this machine.
(Wspominając o nim, ponieważ piszesz, że twoja druga aktualizacja używa WebDeploy, co może sugerować, że pierwsza nie użyłaby jeszcze WebDeploy.)Korzystając z profili wdrażania wprowadzonych w VS 2012, można publikować za pomocą następującego wiersza polecenia:
Aby uzyskać więcej informacji na temat parametrów, zobacz to .
Wartości
/p:VisualStudioVersion
parametru zależą od wersji programu Visual Studio. Wikipedia ma tabelę wydań Visual Studio i ich wersji .źródło
/p:VisualStudioVersion=?
dla VS 2017?msbuild test.sln /p:DeployOnBuild=True /p:DeployDefaultTarget=WebPublish /p:WebPublishMethod=FileSystem /p:DeleteExistingFiles=True /p:publishUrl=.\build_output1\pub /p:PublishProfile=FolderProfile /p:VisualStudioVersion=11.0 /p:outdir=.\build_output1
...... Ale nadal otrzymuję tylko biblioteki DLL, a nie wszystkie pliki jak w folderze publikowania: (`/p:VisualStudioVersion=15
. Nie jestem pewien, czy jest to związane z problemem z kopiowaniem plików.Wymyśliłem takie rozwiązanie, działa świetnie dla mnie:
Tajny sos jest celem _WPPCopyWebApplication.
źródło
error MSB4057: The target "_WPPCopyWebApplication" does not exist in the project
. Wyjęcie tej części doprowadziło do wdrożenia bez wdrożenia żadnych widokówMSBuild.exe C:\BuildAgent\work\4c7b8ac8bc7d723e\WebService.sln /p:Configuration=Release /p:OutputPath=bin /p:DeployOnBuild=True /p:DeployTarget=MSDeployPublish /p:MsDeployServiceUrl=https://204.158.674.5/msdeploy.axd /p:username=Admin /p:password=Password#321 /p:AllowUntrustedCertificate=True /p:DeployIisAppPath=Default WebSite/New /p:MSDeployPublishMethod=WMSVC
. Daje mi błądMSBUILD : error MSB1008: Only one project can be specified. Switch: WebSite/New
. Czy jest na to rozwiązanie?Nie znam TeamCity, więc mam nadzieję, że to zadziała.
Najlepszym sposobem, jaki udało mi się to zrobić, jest MSDeploy.exe. Jest to część projektu WebDeploy prowadzonego przez Microsoft. Możesz pobrać bity tutaj .
W WebDeploy uruchamiasz wiersz poleceń
To robi to samo, co polecenie VS Publish, kopiując tylko niezbędne bity do folderu wdrażania.
źródło
W VisualStudio 2012 istnieje sposób obsługi subj bez profili publikowania. 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 „PublueUrl”. Możesz użyć VS100COMNTOOLS, jednak musisz zastąpić VisualStudioVersion, aby użyć docelowego „WebPublish”
%ProgramFiles%\MSBuild\Microsoft\VisualStudio\v11.0\WebApplications\Microsoft.WebApplication.targets
. Z VisualStudioVersion 10.0 ten skrypt się powiedzie bez żadnych wyników :)Aktualizacja: Udało mi się użyć tej metody na serwerze kompilacji z zainstalowanym tylko pakietem Windows SDK 7.1 (bez programu Visual Studio 2010 i 2012 na komputerze). Ale musiałem wykonać następujące kroki, aby to zadziałało:
Scenariusz:
źródło
znalazł dwa różne rozwiązania, które działały w nieco inny sposób:
1. To rozwiązanie jest inspirowane odpowiedzią Alexandra [link] . Niestety nie działało to dla nas - niektóre pliki dll nie zostały skopiowane do OutDir. Okazało się, że zastąpienie
Wadą tego rozwiązania był fakt, że OutDir zawierał nie tylko pliki do publikacji.ResolveReferences
wBuild
celu rozwiązuje problemu - teraz wszystkie niezbędne pliki są kopiowane do lokalizacji OUTDIR.2. Pierwsze rozwiązanie działa dobrze, ale nie tak, jak się spodziewaliśmy. Chcieliśmy mieć funkcjonalność publikowania taką, jaka jest w Visual Studio IDE - tzn. Tylko pliki, które powinny zostać opublikowane, zostaną skopiowane do katalogu Output. Jak już wspomniano, pierwsze rozwiązanie kopiuje znacznie więcej plików do OutDir - strona internetowa do publikacji jest następnie przechowywana w
_PublishedWebsites/{ProjectName}
podfolderze. Poniższe polecenie rozwiązuje ten problem - tylko pliki do opublikowania zostaną skopiowane do żądanego folderu. Masz teraz katalog, który można bezpośrednio opublikować - w porównaniu z pierwszym rozwiązaniem zaoszczędzisz trochę miejsca na dysku twardym.AutoParameterizationWebConfigConnectionStrings=false
parametr zagwarantuje, że parametry połączenia nie będą traktowane jako specjalne artefakty i zostaną poprawnie wygenerowane - więcej informacji znajduje się w linku .źródło
Musisz ustawić swoje środowiska
i odnieś się do mojego bloga. (przepraszam post był koreański)
http://blog.naver.com/PostSearchList.nhn?SearchText=webdeploy&blogId=xyz37&x=25&y=7
źródło
To mój plik wsadowy
źródło
to moja działająca partia
Publiczna-moja-strona.bat
Zauważ, że zainstalowałem Visual Studio na serwerze, aby móc uruchomić,
MsBuild.exe
ponieważMsBuild.exe
foldery w .Net Framework nie działają.źródło
msbuild test.sln /p:DeployOnBuild=True /p:DeployDefaultTarget=WebPublish /p:WebPublishMethod=FileSystem /p:DeleteExistingFiles=True /p:publishUrl=.\build_output1\pub /p:PublishProfile=FolderProfile /p:VisualStudioVersion=11.0 /p:outdir=.\build_output1
...... Ale nadal otrzymuję tylko biblioteki DLL, a nie strukturę plików, której chcę. Co jest z tym nie tak? :(Możesz opublikować rozwiązanie z pożądaną ścieżką za pomocą poniższego kodu, tutaj PublishInDFolder to nazwa, która ma ścieżkę, w której musimy opublikować (musimy to utworzyć w poniższym obrazku)
Możesz utworzyć plik publikowania w ten sposób
Dodaj poniżej 2 wierszy kodu w pliku wsadowym (.bat)
źródło
Aby wygenerować wynik publikowania, podaj jeszcze jeden parametr. msbuild example.sln / p: opublikuj profil = nazwa profilu / p: deployonbuild = prawda / p: konfiguracja = debuguj / lub dowolny
źródło