MSBuild ItemGroupはクリーン後に空です

私は ItemGroup タグでいくつかの奇妙な振る舞いを見ています。

私のアプリケーションはいくつかのDLLに依存しており、これらのDLLと実行可能ファイルを展開ディレクトリにコピーしています。これはNSISが新しいパッケージからインストールパッケージを作成するために使用します。しかし、私はこれで奇妙な問題に遭遇しています。

ビルドターゲットを定義する前に、ファイルの先頭に次のように ItemGroup を定義します。


したがって、ディレクトリ内のすべてのDLLとバイナリ MyApp.exe を取得します。しかし、プロジェクトがきれいになった場合(つまり、 $(OutputPath)にファイルが存在しない場合) DLLは、ファイルの ItemGroup リストには含まれていません。これから、別のビルド(これは前のビルドのファイルが $(OutputPath)にあります)に続いて ItemGroup には、必要なファイルがすべて含まれています。

また、ビルドスクリプトの出力を確認し、DLLがクリーンアップされたかどうか $(OutputPath)にコピーされます。

ですから、私の質問は、 ItemGroup にDLLが常に含まれるようにビルドスクリプトを修正するにはどうすればいいですか?ビルドが行われる前に ItemGroup にファイルが格納されているようですので、ファイルがビルド前になければリストには含まれませんが、ビルド前に存在する場合はあります。

参考までに、私が使っているビルドターゲットを以下に示します:


    ..\MyApp
    $(MyAppRoot)\MyApp.csproj



    
    
      
    
    
  
1

1 答え

Presumably your item array is declared at the root level in your project, in xml as a child of the element. This means that MSBuild will evaluate the membership in the item array when the project file is first loaded. Whether or not the existance of those files changes during execution is irrelevant. If you want to populate the item array at a particular point in your build, you need to change the declaration from a static item array to a dynamic one, which means moving it inside a target, to the exact spot where you want to gather the files, as:


   ...before message
   ...msbuild task
   
      
      
   
   ...after message

(「 MSBuild Trickery 」の脚注#62から抜粋)

9
追加された
うわー、ありがとう。あなたがそれを行うことができるか分からなかった、私はいつもCreateItem
追加された 著者 Preet Sangha,
ありがとう!私はちょうどこれをしていたSOの無関係の問題に起こった。これは私の問題を解決します!私は3分後にあなたの答えを答えにします:D
追加された 著者 mevatron,
私はその本を読む必要があるように思えます:)
追加された 著者 mevatron,
非常に便利なチップ:)
追加された 著者 Pol,
CreateItemは以前は2.0でやっていた唯一の方法でしたが、MSBuildチームの誰かが名前を付けないという言い方では、今や「忌み嫌われている」とみなされています:)
追加された 著者 Brian Kretzler,
ありがとう!私はなぜ私のコピータスクが何もコピーしない理由を理解しようと1時間を費やしました...今あなたの本を買うことはありません。
追加された 著者 lesscode,