msbuild SLN e ancora ottenere output di progetto separati?
-
06-07-2019 - |
Domanda
Ho un normale file SLN e lo sto compilando bene con msbuild dalla riga di comando. Faccio questo:
C: \ slndir > msbuild / p: OutDir = C: \ slnbin \
E scarica tutto in C: \ slnbin, ad eccezione dei siti Web, che vengono distribuiti in C: \ slnbin_PublishedWe website \.
Quello che vorrei non solo avere tutti i binari rilasciati nella cartella bin, ma anche avere ogni programma eseguibile con il proprio "deploy" " cartella, simile a quella di ogni sito Web
Quindi, ad esempio, se ho i seguenti progetti: - Comune - Lib1 - Servizio 1 - Lib2 - Service2
Voglio diventare:
C:\slnbin\ // Everything
C:\slbin\Deploy\Service1 // Common, Lib1, Service1
C:\slbin\Deploy\Service2 // Common, Lib2, Service2
Ho provato a fare cose come " msbuild / p: OutDir = C: \ slnbin \ $ (ProjectName) " ;, ma lo tratta semplicemente come un valore letterale e crea un vero " $ (ProjectName) " subdir.
Preferibilmente, non dovrei modificare ogni singolo progetto e così via.
È possibile? Facile?
Soluzione
Come ha detto John Saunders, è necessario disporre di un file MSBuild master che gestisca il processo.
Ecco un esempio che utilizza Attività della community di MSBuild : GetSolutionProjects per ottenere i progetti per una data soluzione
<?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>
Altri suggerimenti
Dovrai farlo " manualmente " ;. Creare un file di progetto MSBUILD principale che crea la soluzione, quindi copia tutti gli output della soluzione dove li desidera. Questo è (approssimativamente) il modo in cui Visual Studio Team Build lo fa.