2010-01-06 2 views
7

Ich versuche, eine Aufgabengruppe "Dateien" mit einem Metadatenattribut namens "TargetPath" zu erstellen, das den relativen Pfad zu einer Datei enthält.ItemGroup mit benutzerdefinierten Metadaten in Bezug auf Dateien

Beispiel:
Für diese Pfade:

D: \ Test \ Blah.exe
D: \ Test \ Config \ fun.config
D: \ Test \ en-US \ my .resources.dll

sollte die Ausgabe sein:

Datei Ziel = Blah.exe
Datei Ziel = Config \ fun.config
Datei Ziel = en-US \ my.resources.dll

Hier ist mein bester Versuch ... hoffentlich macht dies meine Frage deutlicher:

<ItemGroup> 
    <Files Include="d:\test\**\*" > 
     <TargetPath>%(RecursiveDir)%(Filename)%(Extension)</TargetPath> 
    </Files> 
</ItemGroup> 

<Message Text="File Target = @(Files->'%(TargetPath)')"/> 

Ich möchte, dass "TargetPath" korrekt ausgefüllt wird ... derzeit scheint es null oder leer zu sein. Wer weiß, was ich vermisse?

Edit:

Ja, merke ich, kann ich dies tun:

<Message Text="File Target = @(Files->'%(RecursiveDir)%(Filename)%(Extension)')"/> 

Allerdings bin ich dieses ItemGroup Aufbau der ResolveManifestFiles MSBuild-Aufgabe zu verwenden, die, dass ich aufbauen erfordert ein TaskItem mit dem TargetPath-Metadatenattribut, um diesen Wert anpassen zu können.

Antwort

6

Sie versuchen, einer Elementgruppe vor der Erstellung dynamische Metadaten zuzuweisen. In Ihrem Beispiel gibt es keine Notwendigkeit für benutzerdefinierte Metadaten zu erstellen, da diese Information bereits Teil der bekannten Metadaten ist, so können Sie einfach tun:

<ItemGroup> 
    <Files Include="d:\test\**\*" ></Files> 
</ItemGroup> 

<Message Text="File Target = @(Files->'%(RecursiveDir)%(Filename)%(Extension)')"/> 

Oder:

<Message Text="File Target = %(Files.RecursiveDir)%(Files.Filename)%(Files.Extension)"/> 

EDIT:

Dieses Beispiel verwendet CreateItem Aufgabe dynamisch die ItemGroup zu aktualisieren:

<ItemGroup> 
    <Files Include="d:\test\**\*" ></Files> 
</ItemGroup> 

<CreateItem 
    Include="@(Files)" 
    AdditionalMetadata="TargetPath=%(RecursiveDir)%(Filename)%(Extension)"> 
     <Output TaskParameter="Include" ItemName="Files"/> 
</CreateItem> 
+0

ich sehe, dass, aber ich versuche, eine andere Aufgabe zu verwenden, die ich übergeben, um es auf den Taskitems setzt diese Metadaten-Attribut zu haben –

+0

Meine Antwort aktualisieren - hoffe es hilft. – KMoraz

0

ich mag die CreateItem Methode wie folgt zu verwenden:

<ItemGroup> 
    <Reference Include="Newtonsoft.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> 
     <HintPath>..\packages\Newtonsoft.Json.8.0.2\lib\net45\Newtonsoft.Json.dll</HintPath> 
     <Private>True</Private> 
    </Reference> 
    ... 
    </ItemGroup> 

    <CreateItem Include="@(Reference)" Condition="'%(Reference.Private)' == 'True'" AdditionalMetadata="TargetPath=$([System.IO.Path]::GetFileName(%(Reference.HintPath)))"> 
    <Output TaskParameter="Include" ItemName="DLLFiles"/> 
    </CreateItem> 

    <Message Text="HintPaths: &quot;@(DLLFiles->'$(OutputPath)%(TargetPath)')&quot;" Importance="high" /> 

ich Wandelt bin mit nur die Dateinamen nur zu bekommen.

Ausgang:

HintPaths: „bin \ Release \ log4net.dll, bin \ Release \ Newtonsoft.Json.dll; bin \ Release \ RabbitMQ.Client.dll; bin \ Release \ ReflectSoftware.Insight.dll“

1

Moderne MSBuild erfordert nicht Create (seit .NET 3.5)

Sie können es tun, wie folgt:..

<ItemGroup> 
    <Files Include="d:\test\**\*" /> 
    <FilesWithMetadata Include="%(Files.Identity)" > 
     <TargetPath>%(RecursiveDir)%(Filename)%(Extension)</TargetPath> 
    </FilesWithMetadata> 
</ItemGroup> 
Verwandte Themen