2010-01-06 9 views
7

Estoy tratando de crear un grupo de elementos de tareas "Archivos" con un atributo de metadatos llamado "TargetPath" rellenado con la ruta relativa a un archivo.Grupo de artículos con metadatos personalizados con respecto a los archivos

Ejemplo:
Por estos caminos:

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

La salida debe ser:

Target archivo =Blah.exe Target Archivo = Config \ fun.config
Archivo de destino = es-MX \ my.resources.dll

Aquí está mi mejor intento ... espero que esto hace que mi pregunta clara:

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

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

Me gustaría que "TargetPath" se llenara correctamente ... actualmente parece ser nulo o está vacío. Alguien sabe lo que me estoy perdiendo?

Editar:

Sí, me doy cuenta de que puedo hacer esto:

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

Sin embargo, estoy construyendo este ItemGroup utilizar la tarea ResolveManifestFiles MSBuild, que requiere que construyo un TaskItem con el atributo de metadatos TargetPath para poder personalizar ese valor.

Respuesta

6

Está intentando asignar metadatos dinámicos a un grupo de elementos antes de que se creen. En su ejemplo que no hay necesidad de crear metadatos personalizados ya que esta información es ya parte de los metadatos bien conocido, por lo que sólo se puede hacer:

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

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

O:

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

EDIT:

este ejemplo se utiliza CreateItem tarea para actualizar dinámicamente el ItemGroup:

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

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

veo que, sin embargo yo estoy tratando de utilizar otra tarea que se basa en los TaskItems los que paso a ella para tener este atributo de metadatos –

+0

Ver mi respuesta de actualización - espero que ayude. – KMoraz

0

Estoy gusto el CreateItem método a utilizar como esto:

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

Estoy utilizando las transformadas para obtener sólo el nombre de archivo.

Salida:

HintPaths: "bin \ Release \ log4net.DLL; bin \ Release \ Newtonsoft.Json.dll; bin \ Release \ RabbitMQ.Client.dll; bin \ Release \ ReflectSoftware.Insight.dll"

1

moderna MSBuild no requiere CreateTask (ya que .NET 3.5)

puede hacerlo de esta manera:..

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