10

我有一个正在尝试在 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>

我的树看起来像这样:

  • 测试项目
  • 应用程序.sln
  • 应用程序(文件夹)
    • 主文件
    • 属性(文件夹)
      • 装配信息.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 具有全局范围?编译器和 TeamBuild 使用的所有 Targets 文件都做同样的事情,而且它们似乎都是全局的……我不明白为什么这对我不起作用。

有什么帮助吗?

4

4 回答 4

9

您是否尝试过使用 DependsOnTarget 而不是 CallTarget?可能是 CallTarget 导致了范围问题。

于 2009-07-06T20:17:16.697 回答
5

先前的评论者是正确的,您应该将其更改为使用 DependsOnTargets 而不是使用 CallTarget 任务。你看到的是一个错误而不是一个范围问题。避免此错误的方法是使用 DependsOnTargets(无论如何,这是一种更好的方法)。

赛义德·易卜拉欣·哈希米

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

于 2009-07-07T06:26:43.477 回答
1

如前所述,您应该使用 DependsOnTargets。我对 MSBuild 范围进行了一些研究,您可以在我的博客上找到我的结果:http: //blog.qetza.net/2009/10/23/scope-of-properties-and-item-in-an-msbuild -脚本/

事情似乎是项目的全局范围和目标的本地范围。进入目标时,复制全局范围,退出目标时,合并回本地范围。因此,CallTarget 不会获得修改后的本地范围值,但 DependsOnTargets 会因为第一个目标在进入第二个目标之前退出。

于 2009-10-28T10:43:10.303 回答
0

我们在构建中做了类似的事情。我们将版本作为命令行参数传递。

在我们的 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>
于 2009-07-06T21:07:33.817 回答