的ItemGroup项目范围,或者“为什么MSBuild的恨我吗?”(ItemGroup Item

2019-07-29 17:56发布

我有一个解决方案,我试图去建立在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 \框架\ 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使用的目标文件,这样做同样的事情,和他们都似乎是全球性的。我不明白为什么这不是为我工作。

任何帮助吗?

Answer 1:

你是否尝试过使用DependsOnTarget而非CallTarget? 这可能是CallTarget引起的范围问题。



Answer 2:

以前的评论者是正确的,你应该改变这种使用而不是使用CallTarget任务DependsOnTargets。 你们看到的是一个错误不是一个作用域inssue。 该避免的方法这个错误是使用DependsOnTargets(这是一个更好的方法anywayz)。

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

我的书: 里面的微软构建引擎:使用的MSBuild和团队基础生成



Answer 3:

至于说,你应该使用DependsOnTargets。 我已经做了的MSBuild范围的一些研究,你可以找到我在我的博客的结果: http://blog.qetza.net/2009/10/23/scope-of-properties-and-item-in-an-msbuild -脚本/

问题是似乎是项目和目标局部范围全局范围。 当输入目标,在全球范围内被复制,并在离开时的目标,局部范围合并回。 所以CallTarget不会得到修改后的局部范围值,但DependsOnTargets将自第一目标是进入第二目标之前退出。



Answer 4:

我们做我们的建设类似的东西。 我们通过版本作为命令行参数。

在我们的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>


文章来源: ItemGroup Item scope, alternatively “Why does MSBuild hate me?”