ItemGroup项目范围,或者"为什么MSBuild讨厌我?"

Chr*_*per 10 c# msbuild tfs scope team-build

我有一个解决方案,我想在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>
Run Code Online (Sandbox Code Playgroud)

我的树看起来像这样:

  • 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
Run Code Online (Sandbox Code Playgroud)

那么,我如何让我的ItemGroup具有全局范围?编译器和TeamBuild使用的所有Targets文件都做同样的事情,而且它们似乎都是全局的...我不明白为什么这对我不起作用.

有帮助吗?

tec*_*ile 9

您是否尝试过使用DependsOnTarget而不是CallTarget?可能是CallTarget引起了范围问题.


Say*_*imi 5

前一个评论者是正确的,您应该更改此选项以使用DependsOnTargets而不是使用CallTarget任务.你所看到的是一个bug,而不是一个范围问题.该避免的方法这个错误是使用DependsOnTargets(这是一个更好的方法anywayz).

Sayed Ibrahim Hashimi

我的书:Microsoft Build Engine内部:使用MSBuild和Team Foundation Build