2010-08-10 24 views
5

2 dosya için ilgili öğeleri almak ve oluşturmak için MSBuild kullanmak istiyorum. sadece tek bir dosya uzantısı olsaydı, kullanırsınız:MSBuild: Silverlight yapısında hem "* .xaml" hem de "* .cs" ifadesinin nasıl eklenir?

<ItemGroup> 
    <Compile Include="Pages\SilverlightControl1.xaml.cs"> 
     <DependentUpon>SilverlightControl1.xaml</DependentUpon> 
    </Compile> 
    <Compile Include="Pages\SilverlightControl2.xaml.cs"> 
     <DependentUpon>SilverlightControl2.xaml</DependentUpon> 
    </Compile> 
</ItemGroup> 
:

<ItemGroup> 
    <Compile Include="\Pages\*.cs" /> 
</ItemGroup> 

bir .Csproj dosyasında bir Silverlight yapı için, her UserControl <Compile> elemanı ve bir çocuk <DependentUpon> eleman başlıbaşına olduğu gibi ayarlanır

kapmak tüm .cs dosyaları veolanlar koyun: MSBuild dosyasında

, ben belirtmek isterim özniteliği ve aynı dosya adını al -eksi ve bunu <DependentUpon> öğesinin içine koyun.

sadece (pseudo) gibi bir şey dosya çift maç olacağını Yani :

<ItemGroup> 
    <Compile Include="Pages\*.cs"> 
     <DependentUpon>Pages\*.xaml</DependentUpon> 
    </Compile> 
</ItemGroup> 

MSBuild yukarıdaki koyarım için bir yol var mı? MSBuild

cevap

4

MSBuild, %(Filename) (uzantısı olmayan dosya adı) ve %(Extension) adlı iki ayrı meta veri özelliğine sahiptir; bu örnekte ".cs" olur. Ben bunu olacak ve hatta bunu yapmak istediğinizi yaparsınız ne gibi sanmıyorum,

<ItemGroup> 
    <Compile Include="Pages\*.cs"> 
     <DependentUpon>%(Directory)%(Filename)</DependentUpon> 
    </Compile> 
</ItemGroup> 

Ama: Yani, bu mümkün olup olmadığını merak ediyorum.

hedefinde "glob" türü öğelerin (* .cs) gerçekten bir hedefe sahip olmanız gerekir - bir üst düzey öğe grubu olarak bildirmemelisiniz, aksi takdirde görsel stüdyonda komik şeyler yaparsınız ve örnek) tüm .cs dosyalarını sürüm kontrolüne ekleyecek ve hatta * .c'yi projenizdeki münferit öğelere genişletecektir. İşte

Ben OLMAYAN Visual Studio Msbuild projesinde öneririm ne:

Bir VS proje içinde bu yaptıklarını ise
<Target Name="PrepareCompileItems"> 
    <XamlFiles Include="Pages\*.cs"> 
     <DependentUpon>%(Directory)%(Filename)</DependentUpon> 
    </XamlFiles> 

    <Compile Include="@(XamlFiles)" /> 
</Target> 

, o zaman tricker - Eğer zaten varolan meta verileri eklemek istiyorum çünkü ItemGroup derleme önce dependentUpon dernek zorlamak için: Her ne kadar

<Target Name="AddDependentUponMetadata"> 
    <CsFiles Include="Pages\*.cs" /> 

    <XamlFiles Include="@(CsFiles)"> 
     <DependentUpon>%(Directory)%(Filename)</DependentUpon> 
    </XamlFiles> 

    <Compile Remove="@(CsFiles)" />  
    <Compile Include="@(XamlFiles)" /> 
</Target> 

, aslında YMMV yani benim iddialarını test etmeden bu yazarak ediyorum ...

+0

Teşekkürler Peter, bununla uğraşacağım ve işe alabiliyor muyum diye bakacağım. –

2

aşağıdaki gibi yapabilirsiniz:

<ItemGroup> 
     <ClassFiles Include="**\*.cs"/> 
     <XamlFiles Include="**\*.xaml"/> 
     <Compile Include="@(ClassFiles)" > 
      <DependentUpon>"@(XamlFiles)"</DependentUpon> 
     </Compile> 
    </ItemGroup> 

bunun istediğiniz veya i Sorunuzun uzak neysem mı?

+0

Teşekkürler Malcolm, Bunu işe alabilir miyim göreceğim. –

İlgili konular