12

1 つのビルド ターゲットで定義された値を他のターゲットで有効にするにはどうすればよいですか? PropertyGroup が、ここで使用する必要がある書き込み MsBuild エンティティではない場合、何ですか? ReleaseDir は「Package」ターゲットでは正常に出力されますが、「DoPackage」では空です

<Target Name="Package">
  <PropertyGroup>
    <ReleasesDir>c:\tmp</ReleasesDirBase>
  </PropertyGroup>
  <Message Text="$(ReleaseDir)"/>
  <CallTarget Targets="DoPackage" Condition="!Exists('$(ReleaseDir)')"/>
</Target>

<!-- Do the acutal packaging -->
<Target Name="DoPackage">
  <Message Text="Creating package in '$(ReleaseDir)'"/>
  <Error Condition="'$(ReleaseDir)' == ''" Text="No ReleaseDir defined"/>
  <MakeDir Directories="$(ReleaseDir)"/>
  ...
</Target>
4

3 に答える 3

22

プロパティと CallTarget タスクには、よく知られている問題があります。代わりに DependsOnTargets を使用する必要があります。

<Target Name="Package">
  <PropertyGroup>
    <ReleasesDir>c:\tmp</ReleasesDir>
  </PropertyGroup>
  <Message Text="$(ReleasesDir)"/>
</Target>

<Target Name="PrePackage" DependsOnTargets="Package">
  <CallTarget Targets="DoPackage" Condition="!Exists('$(ReleasesDir)')"/>
</Target>

<!-- Do the actual packaging -->
<Target Name="DoPackage" DependsOnTargets="Package">
  <Message Text="Creating package in '$(ReleasesDir)'"/>
  <Error Condition="'$(ReleasesDir)' == ''" Text="No ReleaseDir defined"/>
  <MakeDir Directories="$(ReleasesDir)"/>
</Target>
于 2009-09-03T12:44:20.337 に答える
1

この問題を解決する最もクリーンな方法ではないかもしれませんが、ビルド ファイルでCallTargetを使用したい場合は、別のターゲットで PropertyGroup を定義する必要があります。この奇妙な問題の解決策は次のとおりです。

<Target Name="DebugBuild" DependsOnTargets="DebugBuildProp">
  <CallTarget Targets="CompileSolution"/>
</Target>
<Target Name="DebugBuildProp">
  <PropertyGroup>
    <Configuration>Debug</Configuration>
  </PropertyGroup>
</Target>
<Target Name="CompileSolution">
   <Message Text="$(Configuration)" />
</Target>
于 2015-10-16T13:09:15.500 に答える