ItemGroup Предметная область, альтернатива "Почему MSBuild ненавидит меня?"

У меня есть решение, которое я пытаюсь получить на основе TFS. Я хочу обновить версии всех соответствующих файлов, и я застрял, пытаясь сделать это. Есть много ссылок о том, как это сделать, но ни одна из них не работает для меня из-за одной маленькой проблемы... Сфера.

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="DesktopBuild" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
    <Target Name="DesktopBuild">
        <CallTarget Targets="GetFiles"  />

        <Message Text="CSFiles: '@(CSFiles)'" />
    </Target>

    <Target Name="GetFiles">
        <ItemGroup>
            <CSFiles Include="**\AssemblyInfo.cs" />
        </ItemGroup>
        <Message Text="CSFiles: '@(CSFiles)'" />
    </Target>
</Project>

Мое дерево выглядит так:

  • test.proj
  • application.sln
  • приложение (папка)
    • main.cs
    • Свойства (Папка)
      • AssemblyInfo.cs

Когда я запускаю "c:\Windows\Microsoft.NET\Framework\v3.5\MSBuild.exe test.proj" из папки решения... я получаю следующий вывод:

Microsoft (R) Build Engine Version 3.5.30729.1
[Microsoft .NET Framework, Version 2.0.50727.3074]
Copyright (C) Microsoft Corporation 2007. All rights reserved.

Build started 7/6/2009 3:54:10 PM.
Project "D:\src\test.proj" on node 0 (default targets).
  CSFiles: 'application\Properties\AssemblyInfo.cs'
DesktopBuild:
  CSFiles: ''
Done Building Project "D:\src\test.proj" (default targets).


Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:00.04

Итак, как я могу сделать так, чтобы моя ItemGroup имела глобальный охват? Все файлы Targets, используемые компилятором и TeamBuild, делают то же самое, и все они кажутся глобальными... Я не понимаю, почему это не работает для меня.

Любая помощь?

4 ответа

Решение

Вы пытались использовать DependsOnTarget, а не CallTarget? Возможно, что CallTarget вызывает проблему области.

Предыдущий комментатор был верным, вы должны изменить его, чтобы использовать DependsOnTargets вместо использования задачи CallTarget. То, что вы видите, это ошибка, а не обзор области. Чтобы избежать этой ошибки, используйте DependsOnTargets (который намного лучше подходит в любом случае).

Сказал Ибрагим Хашими

Моя книга: Внутри Microsoft Build Engine: Использование MSBuild и Team Foundation Build

Как сказано, вы должны использовать DependsOnTargets. Я провел некоторые исследования в области MSBuild, мои результаты вы можете найти в моем блоге: http://blog.qetza.net/2009/10/23/scope-of-properties-and-item-in-an-msbuild-script/

Дело в том, что, кажется, существует глобальная область для проекта и локальная область для цели. При входе в цель глобальная область копируется, а при выходе из цели локальная область объединяется обратно. Таким образом, CallTarget не получит измененные значения локальной области, но DependsOnTargets получит, так как первая цель закрывается перед входом второй цели.

Мы делаем нечто подобное в нашей сборке. Мы передаем версию в качестве параметра командной строки.

В нашем TFSBuild.proj мы устанавливаем версию на 0.0.0.0, если не была предоставлена ​​версия:

<!--Our assembly version. Pass it in from the command prompt like this: /property:Version=1.0.0.0-->
<PropertyGroup>
    <Version>0.0.0.0</Version>
</PropertyGroup>

<PropertyGroup>
    <!--Used to ensure there is a newline before our text to not break the .cs files if there is no newline at the end of the file.-->
    <newLine>%0D%0A</newLine>

Затем мы делаем это:

<Target Name="BeforeCompile">
    <!--Update our assembly version. Pass it in from the command prompt like this: /property:Version=1.0.0.0-->

    <!--attrib needs to be run first to remove the read only attribute since files from tfs are read only by default.-->
    <Exec Command='attrib -R $(SolutionRoot)\Source\Project\GlobalAssemblyInfo.cs'  />

    <WriteLinesToFile File="$(SolutionRoot)\Source\Project\GlobalAssemblyInfo.cs"
                      Lines='$(newLine)[assembly: AssemblyVersion("$(Version)")]'/>

</Target>
Другие вопросы по тегам