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>
ステートメントが削除されます。
誰が何がうまくいっていないのか理解していますか?
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
このアプローチを使用すると、ビルドターゲットをカスタマイズして、誰もが行った変更の影響を受けることなく、すべてのアプリケーションが正しい設定を取得できるようにします。
Delphiはdprojコンテンツ全体を生成し、このカスタムインポートは常に削除されます。
独自のmsbuild xmlファイルを作成することもできますが、dprojはDelphiに属しています。
あなたがソースコードを持っているか、またはIDEにモンキーパッチを適用する意思がない限り、あなたはそれを行うことができません。
デルファイプロジェクトをビルドし、豊富なターゲットを作成するための柔軟なxmlの方法が本当に必要な場合は、vnext(bitbucketの私のフォーク)が欲しい、または欲しい