2015-03-04 24 views
5

& Çıktılar parametrelerinin arkasındaki mantığı anlamaya çalışıyorum. Çıkışlar & Returns özniteliği kullanılması durumunda çok kafa karıştırıcı davranışlar buldum.MSBuild kafa karıştırıcı davranışı Hedef Çıkışlar ve İadeler

e.x. 2 hedef "Build" ve "InternalTarget" ile bir proje oluşturdum. İlk hedef, çıktısını Çıkışlar özniteliği ile tanımlar ve ikincisi, Çıkışı özniteliği aracılığıyla çıktıyı tanımlar. Yani MSBuild görevi ile Build hedefi dediğimde herhangi bir çıktı alamıyorum - her zaman boş! Ama eğer ikinci hedefi (eğer zaten kullanılmıyorsa) açıklarsam, çıktı sihirli olarak görünür.

Neden olur?

example.proj

<Project ToolsVersion="4.0" 
     DefaultTargets="Build" 
     xmlns="http://schemas.microsoft.com/developer/msbuild/2003">  
    <Target Name="Build" 
      Outputs="Build executed"> 
     <Message Text="Build executing ..." /> 
    </Target> 

    <Target Name="_InternalTarget" 
      Returns="_InternalTarget executed"> 
     <Message Text="_InternalTarget executing ..." /> 
    </Target> 
</Project> 

build.projitibaren

<Project ToolsVersion="4.0" 
     DefaultTargets="Build" 
     xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <ItemGroup> 
     <_ProjectsToBuild Include="example.proj" /> 
    </ItemGroup> 

    <PropertyGroup> 
     <_ProjectsToBuildProperties> 
      Configuration=Debug; 
     </_ProjectsToBuildProperties> 
    </PropertyGroup> 

    <Target Name="Build"> 
     <MSBuild Targets="Build" 
       Projects="@(_ProjectsToBuild)" 
       Properties="$(_ProjectsToBuildProperties)"> 
      <Output TaskParameter="TargetOutputs" 
        ItemName="_ProjectsToBuildOutput" /> 
     </MSBuild> 

     <Message Text="Output: @(_ProjectsToBuildOutput)." /> 
    </Target>  
</Project> 

Çıktı

Build started 3/4/2015 12:41:21 PM. 
Project "C:\Development\Sources\MSBuildReturnsExample\build.proj" on node 1 (default targets). 
Project "C:\Development\Sources\MSBuildReturnsExample\build.proj" (1) is building "C:\Development\Sources\MSBuildReturn 
sExample\example.proj" (2) on node 1 (Build target(s)). 
Build: 
    Build executing ... 
Done Building Project "C:\Development\Sources\MSBuildReturnsExample\example.proj" (Build target(s)). 

Build: 
    Output: . 
Done Building Project "C:\Development\Sources\MSBuildReturnsExample\build.proj" (default targets). 


Build succeeded. 
    0 Warning(s) 
    0 Error(s) 
+3

okudunuz mu? 'çıktılar' dosya adları olmalı,' döner' öğe isimleri olmalıdır. Sadece dizeleri giriyorsun, boşluk ayrıldı. Ne olmasını beklediğinizden emin değil misiniz? – stijn

+0

Sadece gösterim amaçlıdır. Uygun Dosya Adlarını veya Öğe Adlarını kullanırsam hiçbir şey değiştirilmez. Bütün karışıklık burada, proje dosyasında herhangi bir hedef eklerseniz (hiç kullanılmamış olsa bile) Returns özniteliği ile herhangi bir çıktı elde edemeyeceğim. Bu kullanılmayan hedefi yeni kaldırır veya yorum yaparsam, çıktıyı beklendiği gibi alırım ("Oluşturulma"). – Andir

+0

Hmm, gerçekten iyi bir nokta. Ne olduğu hakkında bir fikir yok; example.proj, yapı hedefindeki çıktılar yerine Returns kullanarak sorunu giderir veya _InternalTarget üzerinde Çıktıları kullanır, ancak her ikisini birden karıştırmak bazı nedenlerle çalışmaz. İlginç: P – stijn

cevap

5

MSBuild 4 öncesinde HedefÇıkışlar belirtildi niteliğini herhangi bir öğe döndü

:, bölüm Açıklamalar. Bunu yapmak için, MSBuild, bu öğeleri daha sonra yapım aşamasında istediği görevlerde kaydetmelidir. Hangi hedeflerin arayanların hangi çıktıları gerektirdiğini belirtmenin bir yolu olmadığından, MSBuild tüm Çıkışları tüm Hedefler Hedeflerinde toplanmıştır. Bu, çok sayıda çıktı ürününe sahip olan yapılar için ölçekleme sorunlarına yol açar. Kullanıcı bir İade sahip bir projede herhangi Hedef elemanı üzerinde İade, o zaman sadece bu Hedef s belirtirse

bu öğeleri kaydetmek bağlıyor. "Çıktı: Oluşturuldu" ifadesini görmeyi bekliyorsanız, yukarıdakilere dayanarak,

Eğer example.proj olmaya değiştirmek olmalıdır: Eğer https://msdn.microsoft.com/en-us/library/t50z2hka.aspx

<Project ToolsVersion="4.0" 
     DefaultTargets="Build" 
     xmlns="http://schemas.microsoft.com/developer/msbuild/2003">  
    <Target Name="Build" 
      Returns="Build executed"> 
     <Message Text="Build executing ..." /> 
    </Target> 

    <Target Name="_InternalTarget" 
      Returns="_InternalTarget executed"> 
     <Message Text="_InternalTarget executing ..." /> 
    </Target> 
</Project> 
+0

Evet, işte bu!Bir sonraki paragrafta, açıkça, hedef İade'nin spesifik davranışından bahsedilmektedir. Teşekkürler! – Andir