2

2つの実行可能ファイルをビルドする必要があるプロジェクトがあります。1つはDelphiXE2で、もう1つはXE3で作成します。各バージョンをビルドするビルドスクリプトがあります(つまり、XE2用に1つ、XE3用に1つ)。

実行したIDEの最後のバージョンのビルドスクリプトを実行すると、すべて正常に機能します(つまり、Delphi XE2を実行し、アプリをビルドし、XE2ビルドスクリプトを実行します)。

ただし、別のバージョンのIDEを実行したばかりのビルドスクリプトを実行すると、アプリが起動するとすぐにAVが表示されます(つまり、Delphi XE2、ビルドアプリを実行し、XE3ビルドスクリプトを実行します)。

ビルドスクリプトに関する何かがIDEによってキャッシュ/変更されているように見え、ビルドに使用するバージョンに適切なデータを復元する必要があります。.dprojでこれを試しましたが、運がありません。

または、フォームリソースを読み込んでいる可能性があります。どちらのエディションでも、IDEの場合、起動時にプロパティが存在しないためにエラーが表示されます。もしそうなら、すべての.fmxファイルの複数のバージョンを維持することなくこれを回避する簡単な方法はありますか?

ビルドスクリプトのサンプルは次のとおりです。

set path=%path%;c:\Windows\Microsoft.NET\Framework\v3.5
set path=%path%;c:\Program Files (x86)\Embarcadero\RAD Studio\10.0
set path=%path%;c:\Documents and Settings\All Users\Documents\RAD Studio\10.0
set BDS=c:\Program Files (x86)\Embarcadero\RAD Studio\10.0
set FrameworkDir=c:\Windows\Microsoft.NET\Framework\
set FrameworkVersion=v3.5

set failed=false
cd \myprogs\monkeystyler
msbuild monkeystyler.dproj /t:build /p:config=full||set failed=true
cd build
if not %failed%==true goto Done

echo ****FAILED TO BULD MONKEYSTYLER
****
Pause
exit

:done
4

3 に答える 3

7

XE3スクリプトのこの行を見てみましょう。

set path=%path%;c:\Program Files (x86)\Embarcadero\RAD Studio\10.0

私の推測では、XE2スクリプトでそれを次のようにフォローアップします。

set path=%path%;c:\Program Files (x86)\Embarcadero\RAD Studio\9.0

この時点で、パス変数は次のようになります。

set path=%path%;c:\Program Files (x86)\Embarcadero\RAD Studio\10.0;c:\Program Files (x86)\Embarcadero\RAD Studio\9.0

したがって、最初のスクリプトからのパスが先に表示されるため、2番目のスクリプトは失敗します。

これを修正するためのエレガントな方法は、スクリプトでsetlocalとを使用しendlocalて、それらを互いに分離することです。

setlocal
set path=%path%;c:\Windows\Microsoft.NET\Framework\v3.5
set path=%path%;c:\Program Files (x86)\Embarcadero\RAD Studio\10.0
.....
endlocal

それを修正するためのハッキーな方法は、次のようにパスを設定することです。

set path=c:\Program Files (x86)\Embarcadero\RAD Studio\10.0;%path%

エレガントなアプローチを使用してください!


さらに、pushdとpopdを使用して、各スクリプトへのディレクトリ変更を分離する必要があります。

これですべてが解決しない場合は、さらに情報を提供してください。まず、エラーメッセージは非常に便利です。

于 2012-10-06T16:53:19.520 に答える
1

最後に実行したIDEは、フォルダー内のEnvOption.projを更新し<user>\AppData\Roaming\Embarcadero\BDS\<version>ます。

これには、特にすべての検索パスが含まれます。

このファイルはプロジェクトに間接的に含まれています。したがって、sayを実行してからアプリXE2's IDEをコンパイルするXE3と、間違ったパスが取得されます。

これを無効にして、各プロジェクトのdprojファイルで検索パスを明示的に指定することをお勧めします。

e.g. msbuild myproj.proj /p:ImportEnvOptions=false

これが私の一番の推測です。5年遅すぎたらごめんなさい。私はちょうど同様の問題に苦しんでいます!

ではごきげんよう

スティーブ

于 2017-09-10T11:05:51.177 に答える
0

フォームファイルのリソースであるという疑いに戻りました。

私の理論では、IDEの「間違った」バージョンによって保存されたフォームファイルを使用して、別のバージョンでビルドされたプロジェクトがそれらをロードしようとすると、アプリがプロパティのデータをロードしようとしたためにアクセス違反が発生しました。そのエディションで利用可能。

これをテストするために、IDEの1つのバージョン(この場合はXE3)でプロジェクトを正常にコンパイルし、自動ビルドを実行して、アプリが実行されることをテストしました(実行しました)。

次に、プロジェクトの.fmxファイルをロードし、存在しないプロパティをフォームに追加しました。

ビルドするとアプリは以前と同じように失敗します。

追加されたプロパティを削除すると、ビルドが成功します。

私が今やらなければならないことは、フォームファイルを解析し、構築しているバージョンの存在しないプロパティを削除するためのコードを書くことだけです。

于 2012-10-09T21:22:59.990 に答える