2008-11-03 6 views
3

Dans MSBuild, je souhaite appeler une tâche qui extrait tous les fichiers de tout le projet dans une solution spécifique et conserve ces fichiers dans une propriété qui peut être transmise à d'autres (tâches de traitement, etc.)Sortie de tous les fichiers d'une solution dans une tâche MSBuild

Je pensais quelque chose le long des lignes de:

<ParseSolutionFile SolutionFile="$(TheSolutionFile)"> 
    <Output TaskParameter="FilesFound" ItemName="AllFilesInSolution"/> 
</ParseSolutionFile> 

<Message Text="Found $(AllFilesInSolution)" /> 

qui génèrerait la liste de tous les fichiers dans les projets dans la solution et je pouvais utiliser la propriété AllFilesInSolution en entrée à d'autres tâches d'analyse. Est-ce une tâche déjà existante ou dois-je la construire moi-même? Si j'ai besoin de le construire moi-même, la tâche devrait-elle produire un tableau de chaînes ou d'ITaskItems ou autre chose?

Répondre

2

Je ne connais pas les tâches, mais il existe déjà des propriétés qui contiennent tous les éléments. Il suffit de regarder dans votre fichier de projet typique et vous verrez à quelle collection ils sont ajoutés.

Notez les propriétés contenu, Compile, dossier ... chaque fois que vous ajoutez un fichier à un projet, il est mis dans l'une des principales collections comme ceci:

<ItemGroup> 
    <Content Include="Default.aspx" /> 
    <Content Include="Web.config" /> 
</ItemGroup> 
<ItemGroup> 
    <Compile Include="Default.aspx.cs"> 
    <SubType>ASPXCodeBehind</SubType> 
    <DependentUpon>Default.aspx</DependentUpon> 
    </Compile> 
    <Compile Include="Default.aspx.designer.cs"> 
    <DependentUpon>Default.aspx</DependentUpon> 
    </Compile> 
</ItemGroup> 
<ItemGroup> 
    <Folder Include="App_Data\" /> 
</ItemGroup> 

Ensuite, vous pouvez faire des choses comme ceci pour mettre les valeurs des propriétés existantes dans vos propriétés (l'attribut Condition agit comme un filtre):

<CreateItem Include="@(Content)" Condition="'%(Extension)' == '.aspx'"> 
    <Output TaskParameter="Include" ItemName="ViewsContent" /> 
</CreateItem> 

Ou vous pouvez le faire manuellement (Inclure l'attribut utilise la OutputPath de propriété existante, mais il indique un chemin qui inclues tous les fichiers):

<CreateItem Include="$(OutputPath)\**\*"> 
    <Output TaskParameter="Include" ItemName="OutputFiles" /> 
</CreateItem> 

Il y a plus de détails dans la documentation MSBuild MSDN que je lis quand j'étais débusquer avec des tâches de construction personnalisées et des trucs qui ont été très utiles. Aller lire sur la tâche CreateItem et vous serez en mesure de faire plus de sens de ce que j'ai posté ici. C'est vraiment facile à comprendre.

0

J'utilise ce qui suit pour les solutions avec des projets SSRS (qui ne sont pas compilés sous TFS sans installation vs dans la boîte de construction). Fondamentalement, nous exigeons que les RDL soient regroupés dans une sortie de construction afin que nous puissions marquer une version à publier. Remplacez simplement l'utilisation de la tâche de copie par ce que vous avez besoin de faire avec votre offre groupée. Certes, cela va tout avoir dans la racine de votre solution, mais si vous utilisez TFS, vous ne devriez avoir que des artefacts à construire.

Questions connexes