web-dev-qa-db-ja.com

Delphi XEカスタムビルドターゲットは常に無効になっています

Delphi XEプロジェクトにIDE=を介してインクルードし、プロジェクトマネージャーのコンテキストメニューから有効にしたカスタムMSBuild .targetsファイルを作成しました。ファイルは検証されますが、プロジェクトファイルを再保存すると、常に無効になります。

これは、Custom.targetsという名前のターゲットファイルの簡易バージョンです。

<Project xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">
  <Target Name="Hello">
    <Message Text="Hello from custom target"/>
  </Target>
</Project>

スタンドアロンファイルとして、これは期待どおりに機能します。

MSBuild Custom.target /t:Hello

...コマンドラインで期待されるメッセージを表示します。

IDEを介してDelphiプロジェクトにCustom.targetsを追加すると、ファイルがプロジェクトマネージャーに期待どおりに表示され、.dprojファイルに次の行が含まれます...

<TargetsFile Include="Custom.targets"/>

IDEのプロジェクトマネージャーでファイルを右クリックし、Enableを選択しました。ただし、プロジェクトがビルドされると、Buildメッセージウィンドウが表示されます。

[MSBuild警告] Custom.targets(1):無効なインポートを無視:PathToProjectSource\\Custom.targets

Project Managerでもう一度右クリックしても、期待されるEnableではなくDisableオプションが表示されます。

コマンドラインでMSBuild ProjectName.dproj /t:Helloも失敗します。

.dprojファイルをハッキングして行を追加しようとしました...

<Import Project="Custom.targets"/>

入力MSBuild ProjectName.dproj /t:Helloが機能するようになりました。しかし、次回IDE=からプロジェクトファイルを保存するときに、<Import>ステートメントが削除されます。

誰が何がうまくいっていないのか理解していますか?

177
delphidabbler

IDEからコンパイルするとき、どの構成とターゲットを適用したかを知るのは少し面倒なので、ターゲットファイルを手動で含め、MSBuildを使用して外部でビルドします(これがプロジェクトをクリックしたり、有効なターゲットからクリックしたりしても、カスタムターゲットが有効になっているという視覚的なヒントは得られません)。

私は通常Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets"の前にそれを行うので、IDEには表示されません(それらは存在しますが、開発者には隠されています)。

たとえば、私のDelphi XE4プロジェクトは次で終わります:

    <Import Project="..\BuildServer.Targets"/>
    <Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')"/>
    <Import Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj" Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')"/>
</Project>

私の.targetsファイルは、条件付きのカスタム "PropertyGroup"と "Target"を定義しているため、MSBuildから呼び出された場合にのみ適用されます。

  <PropertyGroup  Condition="'$(Config)'=='CustomConfig'">
    <DCC_Define>RELEASE;$(DCC_Define)</DCC_Define>
    ...
  </PropertyGroup>
  <Target Name="DisplayProjectInfo">
    <Message Text="Project File Name = $(MSBuildProjectFile)"/>
    <Message Text="Version = $(VerInfo_Keys)"/>
    <Message Text="OutputDir = $(DCC_ExeOutput)"/>
  </Target>
  <Target Name="CustomTarget" Condition="'$(Config)'=='CustomConfig'">
  <MSBuild Projects="$(MSBuildProjectFile)" Targets="Clean" />
    <MSBuild Projects="$(MSBuildProjectFile)" Targets="Build" />
    <CallTarget Targets="DisplayProjectInfo"/>
  </Target>

次にそれをコンパイルします:

msbuild /t:CustomTarget /p:config=CustomConfig poject.dproj

このアプローチを使用すると、ビルドターゲットをカスタマイズして、誰もが行った変更の影響を受けることなく、すべてのアプリケーションが正しい設定を取得できるようにします。

1
Fran

Delphiはdprojコンテンツ全体を生成し、このカスタムインポートは常に削除されます。

独自のmsbuild xmlファイルを作成することもできますが、dprojはDelphiに属しています。

あなたがソースコードを持っているか、またはIDEにモンキーパッチを適用する意思がない限り、あなたはそれを行うことができません。

デルファイプロジェクトをビルドし、豊富なターゲットを作成するための柔軟なxmlの方法が本当に必要な場合は、vnext(bitbucketの私のフォーク)が欲しい、または欲しい

1
Warren P