10

TFS上に構築しようとしているソリューションがあります。適切なすべてのファイルのバージョンを更新したいのですが、これを実行しようとして立ち往生しています。それを行う方法についてはたくさんのリンクがありますが、1つの小さな問題のためにそれらのどれも私のために機能しません...スコープ。

<?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.exetest.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

CallTargetではなくDependsOnTargetを使用してみましたか?CallTargetがスコープの問題を引き起こしている可能性があります。

于 2009-07-06T20:17:16.697 に答える
5

以前のコメントは正しかったので、CallTargetタスクを使用する代わりにDependsOnTargetsを使用するようにこれを変更する必要があります。あなたが見ているのはバグであり、スコーピングの問題ではありません。このバグを回避する方法は、DependsOnTargetsを使用することです(とにかくこれははるかに優れたアプローチです)。

イブラヒム橋見は言った

私の本:Microsoftビルドエンジンの内部:MSBuildとTeamFoundationビルドの使用

于 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は変更されたローカルスコープ値を取得しませんが、2番目のターゲットに入る前に最初のターゲットが終了するため、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 に答える