2010-01-06 10 views
7

Próbuję utworzyć grupę zadań "Pliki" z atrybutem metadanych o nazwie "TargetPath" wypełnionym względną ścieżką do pliku.ItemGroup Z niestandardowymi metadanymi dotyczącymi plików

przykład:
Na tych ścieżkach:

D: \ Test \ Blah.exe
D: \ Test \ konfiguracji \ fun.config
D: \ Test \ en US \ My .resources.dll

wyjście powinno być:

Plik docelowy = Blah.exe
Plik docelowy = Config \ fun.config
Plik docelowy = en-US \ my.resources.dll

Tu jest moja najlepsza próba ... mam nadzieję, że to sprawia, że ​​moje pytanie jaśniejsze:

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

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

Chciałbym, aby "TargetPath" była poprawnie wypełniona ... obecnie wygląda na pustą lub zerową. Czy ktoś wie, czego mi brakuje?

Edit:

Tak, zdaję sobie sprawę, mogę to zrobić:

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

jednak buduję tę ItemGroup używać zadanie ResolveManifestFiles MSBuild, która wymaga, że ​​budować element TaskItem z atrybutem metadanych TargetPath, aby móc dostosować tę wartość.

Odpowiedz

6

Próbujesz przypisać dynamiczne metadane do grupy produktów, zanim zostanie ona utworzona. W przykładzie nie ma potrzeby tworzenia niestandardowych metadanych, ponieważ informacja ta jest już częścią znanego metadanych, dzięki czemu można po prostu zrobić:

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

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

Lub:

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

EDIT:

tym przykładzie użyto CreateItem zadanie dynamicznie aktualizować ItemGroup:

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

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

widzę, że jednak próbuję użyć innego zadania, które polega na TaskItems przechodzę do niego mieć ten atrybut metadanych –

+0

zobaczyć moje aktualizuj odpowiedź - mam nadzieję, że pomaga. – KMoraz

0

ja lubić CreateItem sposób używać tak:

<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" /> 

Używam transformaty prostu tylko nazwę pliku.

wyjściowa:

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

1

Nowoczesne MSBuild nie wymaga CreateTask (od .NET 3.5)

można zrobić to tak:..

<ItemGroup> 
    <Files Include="d:\test\**\*" /> 
    <FilesWithMetadata Include="%(Files.Identity)" > 
     <TargetPath>%(RecursiveDir)%(Filename)%(Extension)</TargetPath> 
    </FilesWithMetadata> 
</ItemGroup> 
Powiązane problemy