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


177

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

これは、という名前のターゲットファイルの簡易バージョンです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

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

Custom.targetsIDEを介してDelphiプロジェクトに追加すると、.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>ステートメントが削除されます。

誰が何が悪いのか分かりませんか?


10
コマンドラインからmsbuildを使用する例では、Custom.targetを表示していますが、それ以外の場所ではCustom.targetsを使用しています。どっち?
Kenneth Cochran 14年

4
良い点-コードをじっと見つめているにもかかわらず、私はそれに気づかなかった。Delphiを搭載したマシンに数日間(病院で!)到達することはできませんが、可能な場合は常に「ターゲット」または「ターゲット」を使用してコードを試します。
デルフィダブラー2014年

6
Delphiユーザーではありませんが、これによると すべての.targetsファイルには、エラーのない有効なMSBuildスクリプトが含まれている必要があります。ファイルにエラーがある場合は通知され、プロジェクトが無効な.targetsファイルを参照している場合は無効になり、エラーが修正されるまで再度有効にすることはできません。あなたが得ている症状を説明しているので、すべてが正しいことを再確認する価値があるかもしれません。
Daniel Morritt、2015年

XE7では残念ながら問題を再現できません。すべてが期待どおりに機能しているようです。コマンドラインプロンプト/t:Helloから、およびIDEからプロジェクトマネージャーを右クリックしてビルド-ターゲット-こんにちは。私が追加したCustom.targets追加- -プロジェクトマネージャを右クリックして、プロジェクトに(ファイルの閲覧します)。パスは、.dprojファイルと同じディレクトリです。
Ondrej Kelle

回答:


1

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

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

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

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


1

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

私は通常、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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.