Verwenden von MSBuild.exe zum "Veröffentlichen" eines ASP.NET MVC 4-Projekts mit der cmd-Zeile

81

Ich suche nach einem Befehl, der für den ausgeführt wird MSBuild.exe, der nur ein MVC 4-Projekt nimmt und es in einem bestimmten Verzeichnis veröffentlicht.

Zum Beispiel,

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

Dies ist offensichtlich eine falsche Syntax. Ich versuche meine Frage zu vereinfachen.

Diese Frage spricht von einem Build-XML, aber ich versuche nicht, mit so vielen Details etwas zu tun.

Ich versuche einfach, eine Bereitstellung durchzuführen.

Weiter unten in dieser Frage spricht jemand von "MSDeploy". Ich kann das untersuchen, aber ist es die einzige Option? Ich kann Web Deploy nicht auf dem Server installieren. In diesem Fall muss ich nur "Veröffentlichen" und den Inhalt des veröffentlichten Projekts an ein bestimmtes Verzeichnis auf dem Server / Dateisystem senden.

Hat jemand einen Einzeiler, den ich verwenden kann?

Muss ich MSDeploy verwenden?

Erfordert MSDeploy die Installation von Web Deploy auf dem Server?

Erfordert das Einrichten der Webbereitstellung auf dem Server nicht das Einrichten einiger Ports, Berechtigungen und das Installieren einiger IIS-Add-Ons?

Ich würde gerne einfach etwas Einfaches ausführen.

Erik5388
quelle

Antworten:

152

In VS 2012 (sowie in den im Azure SDK für VS 2010 verfügbaren Veröffentlichungsupdates ) haben wir das Veröffentlichen in der Befehlszeile für Webprojekte vereinfacht. Wir haben dies mithilfe von Veröffentlichungsprofilen getan.

In VS für ein Webprojekt können Sie im Veröffentlichungsdialog ein Veröffentlichungsprofil erstellen. Wenn Sie dieses Profil erstellen, wird es automatisch in Ihrem Projekt unter Eigenschaften \ PublishProfiles gespeichert. Sie können das erstellte Profil verwenden, um über die Befehlszeile mit einer Befehlszeile Folgendes zu veröffentlichen.

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

Wenn Sie das Veröffentlichungsprofil (.pubxml-Datei) an einem anderen Speicherort speichern möchten, können Sie den Pfad zum PublishProfile übergeben.

Veröffentlichungsprofile sind MSBuild-Dateien. Wenn Sie den Veröffentlichungsprozess anpassen müssen, können Sie dies direkt in der .pubxml-Datei tun.

Wenn Ihr Endziel darin besteht, Eigenschaften über die Befehlszeile zu übergeben. Ich würde folgendes empfehlen. Erstellen Sie ein Beispiel für ein Veröffentlichungsprofil in VS. Überprüfen Sie dieses Veröffentlichungsprofil, um festzustellen, welche MSBuild-Eigenschaften Sie in der Befehlszeile übergeben müssen. Zu Ihrer Information: Nicht alle Veröffentlichungsmethoden unterstützen die Befehlszeilenveröffentlichung (dh FTP / FPSE).

Zu Ihrer Information, wenn Sie die .csproj / .vbproj anstelle der .sln erstellen und VS 2012 verwenden, sollten Sie auch übergeben /p:VisualStudioVersion=11.0. Weitere Informationen dazu finden Sie unter http://sedodream.com/2012/08/19/VisualStudioProjectCompatabilityAndVisualStudioVersion.aspx .

Sagte Ibrahim Hashimi
quelle
3
Ich denke, das OP möchte die Web-App einfach in einem beliebigen Ordner auf seinem lokalen Computer "bereitstellen".
Richard Szalay
3
Auf einem Bereitstellungsserver müsste eine Person also die Visual Studios-IDE installieren, damit ein solcher Befehl funktioniert.
Erik5388
2
oder könnte ich das einfach tun: microsoft.com/en-us/download/details.aspx?id=30670
Erik5388
10
Funktioniert das in VS 2013? Wenn Sie dieselbe Befehlszeile ausführen, wird keine Veröffentlichung erstellt. Auch keine Fehler. Testen mit einer einfachen Dateisystembereitstellung in einem Veröffentlichungsprofil. Build Works, aber kein Veröffentlichungsergebnis. Ziel ist leer.
Rex Whitten
2
Wenn ich dies verwende, wird mein Debug-Build veröffentlicht, obwohl die .pubxml-Datei <LastUsedBuildConfiguration> Release </ LastUsedBuildConfiguration> hat
reggaeguitar
11

Erstellen Sie eine build.xml-Datei, die wie folgt aussieht

Starten Sie die Visual Studio-Eingabeaufforderung

Führen Sie msbuild build.xml aus

<?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>
nils
quelle
7
Diese Antwort war sehr hilfreich für mich, aber es gibt eine Sache, die ich hinzufügen würde, um sie zu verbessern. Wenn Sie es wie geschrieben ausführen, gibt robocopy den Exit-Code 1 zurück, um eine erfolgreiche Kopie anzuzeigen ... was msbuild zu der Annahme veranlasst, dass der Build fehlgeschlagen ist. Um dies zu umgehen, fügen Sie nach dem Befehl / e im Befehl robocopy einfach "if% errorlevel% leq 1 exit 0 else exit% errorlevel%" hinzu.
Alex
Sowohl die obige Antwort als auch Alex 'Kommentare waren für mich hilfreich. Ich würde auch <RemoveDir Directories = "$ (CopyTo)" /> vor </ Target> hinzufügen, um den Projektordner sauber zu halten.
JackArbiter
6

Der folgende Befehl funktioniert perfekt:

msbuild Myproject.sln  /t:Rebuild /p:outdir="c:\outproject\\" /p:Configuration=Release /p:Platform="Any CPU"
Jamilir
quelle
3
Wenn Sie nur die Inhaltsdateien veröffentlichen möchten, funktioniert dies. Aber web.config Transformationen werden nicht ausgeführt
andreas
1
Diese Methode funktioniert nicht für die Veröffentlichung einer MVC-Website (Ansichten werden nicht kopiert)
eka808
Für eine Webanwendung wie die Web-API werden im Ordner bin keine zwei kritischen Dateien erstellt: App_global.asax.dll und App_global.asax.compiled. Ich empfehle das obige Beispiel von Sayed.
Fred Peters
1

Ich fand, dass die Antwort darin bestand, die Standardkonfiguration bereitzustellen, dh Debug. Die im Veröffentlichungsprofil ausgewählte Konfiguration scheint von MSBuild ignoriert zu werden. Dementsprechend habe ich den Befehl geändert, um die richtige Konfiguration für die Bereitstellung anzugeben ...

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

Dabei ist config-name = Release oder eine andere von Ihnen erstellte Build-Konfiguration

Mick
quelle
0

Bei Webprojekten müssen Sie wie oben beschrieben erstellen, dann aber auch packen / kopieren. Wir verwenden eine Dateikopie anstelle der "Veröffentlichung" ...

Ebenfalls; Wir verwenden DEBUG / RELEASE, um die Website zu erstellen. aber dann tatsächliche Umgebungen, dh "QA" oder "PROD", um die web.config-Transformationen zu handhaben.

Also erstellen wir es zunächst mit RELEASE und verpacken es dann mit QA - im folgenden Beispiel.

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

Damit;

  1. Richten Sie Ihre Eigenschaften ein
  2. Rufen Sie das BuildPackage-Ziel auf
  3. Rufen Sie das CopyOutput-Ziel auf und voila!
James Joyce
quelle