MSBuild dönüşümleri
Dönüşüm, bir öğe listesinin diğerine bire bir dönüştürülmesidir. Bir projenin öğe listelerini dönüştürmesine olanak tanımanın yanı sıra, dönüştürme, hedefin giriş ve çıkışlar arasında doğrudan eşleme tanımlamasını sağlar. Bu konuda dönüşümler ve MSBuild'in projeleri daha verimli bir şekilde oluşturmak için bunları nasıl kullandığı açıklanmaktadır.
Dönüşüm değiştiricileri
Dönüşümler rastgele değildir, ancak tüm dönüştürme değiştiricilerinin %(<ItemMetaDataName>) biçiminde olması gereken özel söz dizimi ile sınırlıdır. Herhangi bir öğe meta verileri dönüşüm değiştirici olarak kullanılabilir. Bu, oluşturulduğunda her öğeye atanan iyi bilinen öğe meta verilerini içerir. İyi bilinen öğe meta verilerinin listesi için bkz . İyi bilinen öğe meta verileri.
Aşağıdaki örnekte, .resx dosyalarının listesi .resources dosyalarının listesine dönüştürülür. %(dosyaadı) dönüşüm değiştiricisi, her .resources dosyasının karşılık gelen .resx dosyasıyla aynı dosya adına sahip olduğunu belirtir.
@(RESXFile->'%(filename).resources')
Örneğin, @(RESXFile) öğe listesindeki öğeler Form1.resx, Form2.resx ve Form3.resx ise, dönüştürülen listedeki çıkışlar Form1.resources, Form2.resources ve Form3.resources olur.
Dekont
Dönüştürülen öğe listesi için özel ayırıcıyı, standart öğe listesi için ayırıcı belirttiğiniz gibi belirtebilirsiniz. Örneğin, dönüştürülen öğe listesini varsayılan noktalı virgül (;)) yerine virgül (,) kullanarak ayırmak için aşağıdaki XML'yi kullanın: @(RESXFile->'Toolset\%(filename)%(extension)', ',')
Birden çok değiştirici kullanma
Dönüştürme ifadesi, herhangi bir sırada birleştirilebilen ve tekrarlanabilen birden çok değiştirici içerebilir. Aşağıdaki örnekte, dosyaları içeren dizinin adı değiştirilir, ancak dosyalar özgün adı ve dosya adı uzantısını korur.
@(RESXFile->'Toolset\%(filename)%(extension)')
Örneğin, öğe listesinde yer alan RESXFile
öğeler Project1\Form1.resx, Project1\Form2.resx ve Project1\Form3.text ise, dönüştürülen listedeki çıkışlar Toolset\Form1.resx, Toolset\Form2.resx ve Toolset\Form3.text olur.
Bağımlılık analizi
Dönüşümler, dönüştürülen öğe listesi ile özgün öğe listesi arasında bire bir eşlemeyi garanti eder. Bu nedenle, bir hedef girişlerin dönüşümleri olan çıkışlar oluşturursa, MSBuild girişlerin ve çıkışların zaman damgalarını analiz edebilir ve hedefi atlamayı, derlemeyi veya kısmen yeniden oluşturmayı seçebilir.
Aşağıdaki örnekteki Kopyala görevinde , öğe listesindeki her dosya, özniteliğinde BuiltAssemblies
bir dönüşüm kullanılarak belirtilen görevin hedef klasöründeki bir dosyayla Outputs
eşler. Öğe listesindeki bir dosya BuiltAssemblies
değişirse, Copy
görev yalnızca değiştirilen dosya için çalışır ve diğer tüm dosyalar atlanır. Bağımlılık analizi ve dönüşümleri kullanma hakkında daha fazla bilgi için bkz . Nasıl yapılır: Artımlı derleme.
<Target Name="CopyOutputs"
Inputs="@(BuiltAssemblies)"
Outputs="@(BuiltAssemblies -> '$(OutputPath)%(Filename)%(Extension)')">
<Copy
SourceFiles="@(BuiltAssemblies)"
DestinationFolder="$(OutputPath)"/>
</Target>
Örnek
Açıklama
Aşağıdaki örnekte dönüşümleri kullanan bir MSBuild proje dosyası gösterilmektedir. Bu örnekte, c:\sub0\sub1\sub2\sub3 dizininde yalnızca bir .xsd dosyası olduğu ve çalışma dizininin c:\sub0 olduğu varsayılır.
Kod
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Schema Include="sub1\**\*.xsd"/>
</ItemGroup>
<Target Name="Messages">
<Message Text="rootdir: @(Schema->'%(rootdir)')"/>
<Message Text="fullpath: @(Schema->'%(fullpath)')"/>
<Message Text="rootdir + directory + filename + extension: @(Schema->'%(rootdir)%(directory)%(filename)%(extension)')"/>
<Message Text="identity: @(Schema->'%(identity)')"/>
<Message Text="filename: @(Schema->'%(filename)')"/>
<Message Text="directory: @(Schema->'%(directory)')"/>
<Message Text="relativedir: @(Schema->'%(relativedir)')"/>
<Message Text="extension: @(Schema->'%(extension)')"/>
</Target>
</Project>
Açıklamalar
Bu örnek aşağıdaki çıkışı oluşturur:
rootdir: C:\
fullpath: C:\sub0\sub1\sub2\sub3\myfile.xsd
rootdir + directory + filename + extension: C:\sub0\sub1\sub2\sub3\myfile.xsd
identity: sub1\sub2\sub3\myfile.xsd
filename: myfile
directory: sub0\sub1\sub2\sub3\
relativedir: sub1\sub2\sub3\
extension: .xsd