4

変数を 1 つのターゲットから、それを開始した親ターゲットに出力しようとしています。例えば、

ターゲット 1 はファイル 2 のタスクを呼び出すだけで、その中に設定された変数を使用できるはずです。しかし、私はそれを機能させることができないようです (おそらく構文が間違っていますか?)。ターゲット 1 は次のようになります。

<Target Name="RetrieveParameter">
    <MSBuild Projects="$(MSBuildProjectFile)" Targets="ObtainOutput" />
    <Message Text="Output = $(OutputVar)" />
</Target>

ターゲット 2 は、テキスト ファイルの値を読み取り、それをプロパティに設定し、変数 'OutputVar' を一致するように設定する場所です。これは、親に返されることになっています。

<Target Name="ObtainOutput" Outputs="$(OutputVar)">
    <ReadLinesFromFile File="output.txt">
        <Output TaskParameter="Lines"
                PropertyName="OutputVar" />
    </ReadLinesFromFile>
</Target>

私は MSBuild タスクにまったく慣れていないので、明らかなことかもしれません。私がやりたいのは、1 つのタスクで変数を設定し、それを呼び出した親タスクで使用できるようにすることだけです。

4

2 に答える 2

5

ジュリアンはあなたに正しい答えを与えましたが、なぜそれが正しいのか説明していません。

MSBuild タスクは初めてなので、Julien の答えが正しい理由を説明します。

MSBuild のすべてのタスクにはパラメーターがあります。それらは、タスクに設定した属性として認識されます。これらのパラメータはいずれも、そのOutput中に要素を配置することで読み戻すことができます。このOutput要素には、使用できる 3 つの属性があります。

  • TaskParameter - これは、取得するタスクの属性/パラメーターの名前です
  • ItemName - これは、そのパラメーター値を入れるアイテムグループです
  • PropertyName - これは、そのパラメーター値を入れるプロパティの名前です

元のスクリプトでは、一方から他方を呼び出していました。2 番目のスクリプトは別のコンテキストで実行されるため、それが設定するプロパティまたは項目グループはそのコンテキストにのみ存在します。したがって、2 番目のスクリプトが完了すると、Output値をキャプチャする要素を指定していない限り、それらの要素は破棄されます。

Outputタスクの下に複数の要素を配置して、複数のパラメーターを取得したり、同じ値を複数のプロパティ/項目グループに設定したりできることに注意してください。

于 2012-06-28T21:36:10.893 に答える
4

タスクを使用する必要TargetOutputsがありMSBuildます:

 <Target Name="RetrieveParameter">
   <MSBuild Projects="$(MSBuildProjectFile)" Targets="ObtainOutput">
     <Output TaskParameter="TargetOutputs" ItemName="OutputVar"/>
   </MSBuild>
   <Message Text="Output = @(OutputVar)" />
 </Target>

( MSBuild タスクの詳細情報。)

于 2010-06-04T05:34:12.680 に答える