Вывести все файлы из решения в задаче MSBuild - PullRequest
3 голосов
/ 03 ноября 2008

В MSBuild я хотел бы вызвать задачу, которая извлекает все файлы во всем проекте в конкретном решении и содержит эти файлы в свойстве, которое можно передать другим задачам (для обработки и т. Д.)

Я думал что-то вроде:

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

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

, который выводил бы список всех файлов в проектах в решении, и я мог бы использовать свойство AllFilesInSolution в качестве входных данных для других задач анализа. Это уже существующее задание или мне нужно построить его самому? Если мне нужно собрать его самому, должна ли задача выводить массив строк или ITaskItems или что-то еще?

Ответы [ 2 ]

2 голосов
/ 04 ноября 2008

Я не знаю о задачах, но уже есть свойства, которые содержат все элементы. Просто посмотрите в свой типичный файл проекта, и вы увидите, к какой коллекции они добавляются.

Обратите внимание на свойства Содержимое , Компиляция , Папка ... каждый раз, когда вы добавляете файл в проект, он помещается в один из такие коллекции:

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

Затем вы можете сделать что-то подобное, чтобы поместить значения из существующих свойств в ваши свойства (атрибут Condition действует как фильтр):

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

Или вы можете сделать это вручную (атрибут Include использует существующее свойство OutputPath, но указывает путь, который включает все файлы):

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

Есть больше подробностей в документации MSDN MSBuild, которую я прочитал, когда занимался пользовательскими задачами сборки и другими полезными вещами. Перейдите к задаче CreateItem, и вы сможете больше понять из того, что я написал здесь. Это действительно легко подобрать.

0 голосов
/ 28 марта 2014

Я использую следующее для решений с проектами SSRS (которые не собираются под TFS без установленной на коробке сборки). По сути, мы требуем, чтобы RDL были объединены в выходные данные сборки, чтобы мы могли пометить сборку для выпуска.

<Target Name="CopyArtifactstoDropLocation">
  <CreateItem Include="$(SolutionRoot)\**\*.*">
    <Output TaskParameter="Include" ItemName="YourFilesToCopy" />
  </CreateItem>

  <Copy
    SourceFiles="@(YourFilesToCopy)"
    DestinationFiles="@(YourFilesToCopy->'$(DropLocation)\$(BuildNumber)\Release\%(RecursiveDir)%(Filename)%(Extension)')" />
</Target>

Просто замените использование задачи копирования на все, что вам нужно сделать с вашим пакетом. Конечно, это позволит получить все в корне вашего решения, но если вы используете TFS, то у вас должны быть только наращиваемые артефакты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...