2009-07-06 16 views
10

私はTFSで構築しようとしている解決策があります。私はすべての適切なファイルのバージョンを更新したいと思います。それを行う方法にはたくさんのリンクがありますが、どれも少しの問題のために私のために働くものはありません...範囲。ItemGroup Itemスコープ、あるいは「なぜMSBuildが私を嫌うの?

<?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をグローバルスコープにすることができますか?コンパイラとTeamBuildで使用されるすべてのターゲットファイルは同じことを行い、そのすべてがグローバルであるようです...なぜこれが私にとってうまくいかないのか分かりません。

助けが必要ですか?

+0

test.projファイルをビルドしようとしていますか? AssemblyInfo.csを指定する理由とプロジェクトファイルからビルドするだけの理由がわかりません。 –

+0

問題を示す最小の例としてtest.projファイルを構築しました。実際には、TFSに複数のソリューションファイルを構築しようとしています。これは、ItemGroupsおよびTargetsに表示されているスコーピングの動作を示すためのものです。 –

+0

私は助けようとしているすべての人々をupvoteすることができればいいと思うが、明らかに私はあまりにも 'newb'です。私はちょうど私がここで誰もが見ている時間を感謝し、これについて考えているメモを落としたかった。 –

答えて

9

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

+0

これは私にいくつかの情報を与えているようです。 DependsOnを使用してItemGroupのスコープを変更することはできますが、一貫していないようです。ディソンソンと呼ばれるターゲットの兄弟はアイテムグループにアクセスできますが、親は決してしません。 だから変です。スコープルールを示す場所にはどこに文書がありますか?私はそれらを見つけることができませんでした。そして、私は、コールよりもむしろ複雑な依存関係を使ってファイルを書き直さなければならないと思います。 これはとても狂っています。 –

+0

私は何も見たことがありません。 ItemGroupをターゲットの外に完全に移動しようとしましたか?あなたがそれをしたくない理由はありますか? – technophile

+0

またはそれを空にするために初期化する(Include = "*。WontExist"でハックする) –

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> 
+2

ちょうど、Existsは、そのコードが行うと思われる動作をしません。 Existsは、名前付き変数が存在するかどうかではなく、名前付きファイルが存在するかどうかをチェックします。おそらく、Condition = "'$(Version)' == ''"が必要です。参照してくださいhttp://msdn.microsoft.com/en-us/library/7szfhaft.aspx – technophile

+0

このtechnophile男はスマートなものです。 :-) 彼が言ったこと。ドキュメントの標準的な方法は、一重引用符で囲み、周囲にたくさんの空白を置くことです。 また、この方法は私にとって素晴らしいものではありません。私は、MSBuildのコミュニティタスクメソッドを使用して、attribとregexファイルを更新することをお勧めします。私の問題は動的な場所があるので、更新するファイルリストを構築することです。しかし、ありがとう。 :-) –

+0

クリスおかげさま。 :)私たちは、私たちのCI環境についてたくさんの仕事をしている途中です。だから、これは私の心の中でとても新鮮です。 ;) – technophile

5

以前のコメンターは正しかった、あなたがすべきこれを変更して、CallTargetタスクを使用する代わりにDependsOnTargetsを使用します。あなたが見ているのは、bugです。スコープはありません。 way to avoidこのバグはDependsOnTargetsを使用することです(anywayzよりはるかに良いアプローチです)。マイブック

サイード・イブラヒムHashimi

Inside the Microsoft Build Engine : Using MSBuild and Team Foundation Build

+0

本当にバグですか?ここで提供される説明(http://blogs.msdn.com/b/aaronhallberg/archive/2007/07/16/msbuild-property-evaluation.aspx)も同様に説得力があり、これがそれでも数年後には、これはどうやって動くのですか? –

+0

バグです。http://blogs.msdn.com/b/msbuild/archive/2006/01/03/508629.aspxを参照してください。 –

1

としては、あなたがDependsOnTargetsを使用する必要があり、と述べました。私はあなたが私のブログに私の結果を見つけることができ、MSBuildの範囲にいくつかの研究を行ってきた:http://blog.qetza.net/2009/10/23/scope-of-properties-and-item-in-an-msbuild-script/

事は、ターゲットのためのプロジェクトとローカルスコープのグローバルスコープがあるように思わあります。ターゲットを入力すると、グローバルスコープがコピーされ、ターゲットを終了するときにローカルスコープがマージされます。したがって、CallTargetは変更されたローカルスコープ値を取得しませんが、DependsOnTargetsは最初のターゲットが2番目のターゲットに入る前に終了します。

関連する問題