2009-03-10 13 views
10

Normal bir SLN dosyasına sahibim ve komut satırından msbuild ile iyi bir şekilde derledim.msbuild SLN ve hala ayrı proje çıktıları olsun?

C: Bunu \ slndir> Msbuild/p: OutDir = C: \ slnbin \

Ve C içine her şeyi döker: C dağıtılan olsun web siteleri haricinde \ slnbin: \ slnbin_PublishedWebsites \.

İstediğim şey, tüm ikili dosyaların yalnızca bin dizinine düşmemesi değil, aynı zamanda her bir yürütülebilir programın kendi "dağıtılmış" klasörüne sahip olmasıdır. Aşağıdaki projeleri varsa

Yani, örneğin,:

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

yaptığım çalıştı: - Ortak - Lib1 - Hizmeti1 - - Lib2 Service2

benim hemen wan "msbuild/p: OutDir = C: \ slnbin \ $ (ProjectName)" gibi şeyler, ancak sadece bir literal olarak davranır ve gerçek bir "$ (ProjectName)" altdizi oluşturur.

Tercihen, her bir projeyi vb. Değiştirmek zorunda kalmam.

Bu mümkün mü? Kolay?

cevap

13

John Saunders'ın dediği gibi, işlemi yürüten bir ana MSBuild dosyanız olması gerekir. İşte

örnek MSBuild Community Tasks kullanıyor: Belirli bir çözümü Yani

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

Bu bizim için harika çalışıyor. Bir soru - MSBuild geçen projeleri = "% (ProjectFiles.Fullpath)" olarak adlandırdığınızda, MSBuild her projeyi yalnızca bir kez oluşturmak için yeterince akıllı mı? Örneğin, çözümde foo.dll varsa ve diğer 4 proje tarafından başvurulan, foo.dll bir kez mi, yoksa 4 kez mi, yoksa 5 kez mi? –

+2

"MSBuild.exe'yi başlatmak için Exec Görevini kullanmanın aksine, bu görev alt proje oluşturmak için aynı MSBuild işlemini kullanır. Atlanabilecek önceden oluşturulmuş hedeflerin listesi, ana ve alt yapıları arasında paylaşılır. Yeni MSBuild süreci oluşturulmadığından daha hızlı. " Bu yüzden foo.dll bir kez inşa edilecek sanırım ama emin değilim. –

+2

Bunu oluşturmak için gereken komut satırı nedir? –

1

Bunu "el ile" yapmak zorundasınız. Çözümü oluşturan bir master MSBUILD proje dosyası oluşturun, ardından tüm çözüm çıktılarını istediğiniz yere kopyalar. Bu, (yaklaşık) Visual Studio Team Build'un bunu nasıl yaptığıdır.

+1

Ben csproj dosyaları tüm bağımlılıklarını biliyor olmana kaldıraç olamaz projeleri alır GetSolutionProjects? Bu, iki yerde (csprojs ve msbuild) bağımlılığı sürdürmek zorunda olduğum anlamına mı geliyor? – MichaelGG