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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top