2009-03-10 11 views
10

Ich habe eine normale SLN-Datei, und ich kompiliere es gut mit Msbuild von der Befehlszeile. Ich tue dies:Msbuild SLN und immer noch separate Projektausgaben?

C: \ slndir> msbuild/p: OutDir = C: \ slnbin \

Und es Dumps alles in C: \ slnbin, mit Ausnahme von Websites, auf die C eingesetzt bekommen: \ slnbin_PublishedWebsites \.

Was ich möchte ist, dass nicht nur alle Binärdateien in den Ordner dir fallen gelassen werden, sondern auch jedes ausführbare Programm seinen eigenen "deployed" Ordner hat, ähnlich dem, was jede Webseite bekommt.

So zum Beispiel, wenn ich die folgenden Projekte: - Gemeinsame - Lib1 - Dienste1 - Lib2 - Service2

I wan zu bekommen:

C:\slnbin\ // Everything 
    C:\slbin\Deploy\Service1 // Common, Lib1, Service1 
    C:\slbin\Deploy\Service2 // Common, Lib2, Service2 

Ich habe versucht zu tun Sachen wie "msbuild/p: OutDir = C: \ slnbin \ $ (Projektname)", aber es behandelt es nur als ein Literal und erstellt ein tatsächliches "$ (ProjectName)" Unterverzeichnis.

Vorzugsweise würde ich nicht jedes einzelne Projekt und so weiter ändern müssen.

Ist das möglich? Einfach?

Antwort

13

Wie John Saunders sagte, müssen Sie eine Master-MSBuild-Datei haben, die den Prozess behandelt.

Hier wird eine Probe mit MSBuild Community Tasks: GetSolutionProjects, der die Projekte für eine gegebene Lösung kann ich die Tatsache nicht nutzen So

<?xml version="1.0" encoding="utf-8"?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Package"> 

    <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/> 

    <!-- Specify here, the solution you want to compile--> 
    <ItemGroup> 
    <Solution Include="C:\slndir\solution.sln"/> 
    </ItemGroup> 

    <PropertyGroup> 
    <Platform>AnyCPU</Platform> 
    <Configuration>Debug</Configuration> 

    <!-- Your deployment directory --> 
    <DeployDir>C:\slbin\Deploy</DeployDir> 
    </PropertyGroup> 

    <!-- Gets the projects composing the specified solution --> 
    <Target Name="GetProjectsFromSolution"> 
    <GetSolutionProjects Solution="%(Solution.Fullpath)"> 
     <Output ItemName="ProjectFiles" TaskParameter="Output"/> 
    </GetSolutionProjects> 
    </Target> 

    <Target Name="CompileProject" DependsOnTargets="GetProjectsFromSolution"> 
    <!-- 
     Foreach project files 
     Call MSBuild Build Target specifying the outputDir with the project filename. 
    --> 
    <MSBuild Projects="%(ProjectFiles.Fullpath)" 
      Properties="Platform=$(Platform); 
      Configuration=$(Configuration); 
      OutDir=$(DeployDir)\%(ProjectFiles.Filename)\" 
      Targets="Build"> 
    </MSBuild> 
    </Target> 
</Project> 
+1

Das funktioniert gut für uns. Eine Frage: Wenn Sie MSBuild aufrufen, indem Sie Projects = "% (ProjectFiles.Fullpath)" übergeben, ist MSBuild intelligent genug, um jedes Projekt nur einmal zu erstellen? Zum Beispiel, wenn Sie foo.dll haben, die in der Lösung ist und von 4 anderen Projekten referenziert wird, wird foo.dll einmal, oder 4-mal oder 5-mal aufgebaut? –

+2

"Im Gegensatz zur Verwendung der Exec-Task zum Starten von MSBuild.exe verwendet diese Task den gleichen MSBuild-Prozess zum Erstellen der untergeordneten Projekte. Die Liste der bereits erstellten Ziele, die übersprungen werden können, wird zwischen den übergeordneten und untergeordneten Builds aufgeteilt schneller, weil kein neuer MSBuild-Prozess erstellt wird. " Also denke ich, foo.dll wird einmal erstellt werden, aber ich bin mir nicht sicher. –

+2

Wie lautet die Befehlszeile, um das zu erstellen? –

1

Sie müssen dies "von Hand" tun. Erstellen Sie eine Master-MSBUILD-Projektdatei, die die Lösung erstellt, und kopieren Sie dann alle Lösungsausgaben an die gewünschte Position. Dies ist (ungefähr) wie Visual Studio Team Build es tut.

+1

bekommt, dass die csproj Dateien all ihren Abhängigkeiten wissen? Bedeutet das, dass ich Abhängigkeiten an zwei Stellen (csprojs und msbuild) pflegen muss? – MichaelGG

Verwandte Themen