Użycie programu MSBuild.exe do „opublikowania” projektu ASP.NET MVC 4 za pomocą wiersza cmd


82

Szukam polecenia do uruchomienia przeciwko temu, MSBuild.exeże po prostu bierze projekt MVC 4 i publikuje go w podanym katalogu.

Na przykład,

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

Jest to oczywiście nieprawidłowa składnia. Próbuję uprościć swoje pytanie.

To pytanie dotyczy kompilacji XML, ale nie próbuję robić nic z tak dużą ilością szczegółów.

Po prostu próbuję przeprowadzić wdrożenie.

Dalej w dół tego pytania ktoś mówi o „MSDeploy”. Mogę się temu przyjrzeć, ale czy to jedyna opcja? Nie mam możliwości zainstalowania wdrożenia internetowego na serwerze. W takim przypadku wszystko, co naprawdę muszę zrobić, to „Opublikuj” i wyślij zawartość opublikowanego projektu do podanego katalogu na serwerze / systemie plików.

Czy ktoś ma jedną wkładkę, której mogę użyć?

Czy muszę używać MSDeploy?

Czy MSDeploy wymaga zainstalowania na serwerze wdrożenia internetowego?

Czy skonfigurowanie wdrożenia internetowego na serwerze nie wymaga skonfigurowania niektórych portów, uprawnień i zainstalowania niektórych dodatków usług IIS?

Chciałbym po prostu wykonać coś prostego.

Odpowiedzi:


152

W programie VS 2012 (a także publikowaniu aktualizacji dostępnych w zestawie Azure SDK dla programu VS 2010) uprościliśmy publikowanie w wierszu polecenia dla projektów sieci Web. Zrobiliśmy to za pomocą profili publikowania.

W VS for a web project można utworzyć profil publikacji za pomocą okna dialogowego publikowania. Po utworzeniu tego profilu jest on automatycznie zapisywany w Twoim projekcie w folderze Properties \ PublishProfiles. Możesz użyć utworzonego profilu, aby opublikować z wiersza poleceń za pomocą wiersza polecenia, co następuje.

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

Jeśli chcesz przechowywać profil publikowania (plik .pubxml) w innej lokalizacji, możesz przekazać ścieżkę do PublishProfile.

Profile publikowania to pliki programu MSBuild. Jeśli chcesz dostosować proces publikowania, możesz to zrobić bezpośrednio w pliku .pubxml.

Jeśli Twoim końcowym celem jest przekazanie właściwości z wiersza poleceń. Poleciłbym następujące. Utwórz przykładowy profil publikowania w VS. Sprawdź ten profil publikowania, aby określić, jakie właściwości programu MSBuild należy przekazać w wierszu polecenia. FYI nie wszystkie metody publikowania obsługują publikowanie z wiersza poleceń (np. FTP / FPSE).

Do Twojej wiadomości, jeśli tworzysz plik .csproj / .vbproj zamiast .sln i używasz VS 2012, również powinieneś przekazać /p:VisualStudioVersion=11.0. Aby uzyskać więcej informacji na temat powodów, zobacz http://sedodream.com/2012/08/19/VisualStudioProjectCompatabilityAndVisualStudioVersion.aspx .


3
Myślę, że OP chce po prostu „wdrożyć” aplikację internetową w dowolnym folderze na swoim komputerze lokalnym.
Richard Szalay,

3
więc na serwerze wdrożeniowym osoba musiałaby zainstalować IDE studia wizualnego, aby takie polecenie działało?
Erik5388

2
czy mógłbym po prostu to zrobić: microsoft.com/en-us/download/details.aspx?id=30670
Erik5388,

10
Czy to działa w VS 2013? Uruchomienie tego samego wiersza poleceń nie powoduje opublikowania. Żadnych błędów. Testowanie z prostym wdrożeniem systemu plików w profilu publikacji. budować prace, jutro bez rezultatu publikacji. Miejsce docelowe jest puste.
Rex Whitten

2
Kiedy używam tego, publikuje moją kompilację debugowania, mimo że plik .pubxml ma <LastUsedBuildConfiguration> Release </LastUsedBuildConfiguration>
reggaeguitar

11

Utwórz plik build.xml, który wygląda jak poniżej

Uruchom wiersz polecenia programu Visual Studio

Uruchom 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
Ta odpowiedź była dla mnie bardzo pomocna, ale jest jedna rzecz, którą chciałbym dodać, aby ją poprawić. Jeśli wykonasz to tak, jak napisano, robocopy zwróci kod zakończenia 1, aby wskazać pomyślną kopię ... powodując, że msbuild uzna, że ​​kompilacja nie powiodła się. Aby obejść ten problem, po prostu dodaj „if% errorlevel% leq 1 exit 0 else% errorlevel%” po / e w poleceniu robocopy.
Alex

Zarówno powyższa odpowiedź, jak i komentarze Alexa były dla mnie pomocne. Dodałbym również <RemoveDir Directories = "$ (CopyTo)" /> przed </Target>, aby zachować porządek w folderze projektu.
JackArbiter,

6

Poniższe polecenie działa idealnie:

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

3
jeśli chcesz tylko opublikować pliki treści, to działa. Ale transformacje web.config nie są wykonywane
andreas

1
Ta metoda nie działa w przypadku publikowania witryny MVC (wyświetlenia nie są kopiowane)
eka808

W przypadku aplikacji sieci Web, takiej jak interfejs API sieci Web, w folderze bin nie są tworzone dwa krytyczne pliki: App_global.asax.dll i App_global.asax.compiled. Polecam skorzystać z przykładu Sayeda powyżej.
Fred Peters

1

Znalazłem, że odpowiedzią było wdrożenie domyślnej konfiguracji, tj. Debugowania. Konfiguracja wybrana w profilu publikowania wydaje się być ignorowana przez program MSBuild. W związku z tym zmieniłem polecenie, aby określić poprawną konfigurację dla wdrożenia ...

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

gdzie config-name = Release lub inna utworzona konfiguracja kompilacji


0

W przypadku projektów internetowych musisz budować, jak powyżej, ale musisz także spakować / skopiować. Używamy kopii pliku zamiast „publikowania” ...

Również; używamy DEBUG / RELEASE do budowy strony internetowej; ale potem rzeczywiste środowiska, np. „QA” lub „PROD” do obsługi transformacji web.config.

Więc tworzymy go początkowo za pomocą RELEASE, a następnie pakujemy go za pomocą QA - w poniższym przykładzie.

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

Więc;

  1. Skonfiguruj swoje właściwości
  2. Wywołaj cel BuildPackage
  3. Zadzwoń do celu CopyOutput I voila!
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.