2012-10-06 3 views
2

두 개의 실행 파일을 빌드해야하는 프로젝트가 있습니다. 하나는 Delphi XE2에서, 다른 하나는 XE3에서 빌드합니다. 각 버전 (즉, XE2 용 스크립트와 XE3 용 스크립트)을 빌드하는 빌드 스크립트가 있습니다.MSBuild 및 여러 델파이 버전

실행 한 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 
+0

은 동일한 출력 경로를해야합니까. 빌드 또는 완전히 다른 출력 경로 사이의 완전한 제거가 내 첫 번째 추측이 될 것입니다. –

+2

올바른 Rad Studio 명령 프롬프트 (올바른 환경을 설정해야 함)에서 스크립트를 실행합니까? – kludg

+0

Tony : 빌드를하기 전에/t : 깨끗하게 시도해 보았습니다. 나는 그것이 모든 것을 깨끗이한다고 가정합니다. –

답변

0

나는 이것이 파일 리소스 형태라는 의심으로 돌아갔습니다.

내 이론은 IDE의 '잘못된'버전으로 저장된 양식 파일로, 다른 버전으로 빌드 된 프로젝트가로드하려고 할 때 데이터로드를 시도하는 앱으로 인해 액세스 위반이 발생했다는 이론이었습니다. 해당 버전에서 사용할 수없는 속성

테스트하려면이 IDE의 한 버전 (이 경우 XE3)에서 프로젝트를 성공적으로 컴파일하고 자동화 된 빌드를 실행하여 응용 프로그램이 실행되었는지 테스트했습니다.

그런 다음 프로젝트에 .fmx 파일을로드하고 존재하지 않는 속성을 양식에 추가했습니다.

빌드와 앱이 이전과 동일하게 실패합니다.

추가 된 속성을 제거하고 빌드가 완료되었습니다.

모두 지금 내가해야 할 일은 양식 파일을 구문 분석하고 내가 만들고있는 버전의 존재하지 않는 속성을 제거하는 코드를 작성하는 것입니다.

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 

첫 번째 스크립트의 경로가 더 일찍 나타나기 때문에 두 번째 스크립트가 실패합니다.

이 문제를 수정하는 가장 좋은 방법은 setlocalendlocal을 스크립트에서 사용하여 서로를 구분하는 것입니다.

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를 사용해야합니다.

이 모든 것이 해결되지 않으면 더 많은 정보를 제공하십시오. 처음에는 오류 메시지가 매우 유용합니다.

+0

좋은 수정을 위해 +1하지만 원래의 문제는 해결되지 않았습니다. –

+2

글쎄, 내가 여기서 할 수있는 최선이야. 자세한 오류 메시지가 표시되지 않았으므로 아이디어가 없습니다. –

0

마지막으로 실행 한 IDE는 <user>\AppData\Roaming\Embarcadero\BDS\<version> 폴더의 EnvOption.proj를 업데이트합니다.

여기에는 무엇보다도 모든 검색 경로가 포함되어 있습니다.

이 파일은 프로젝트에 간접적으로 포함됩니다. 따라서 XE2's IDE라고 말한 다음 XE3 앱을 컴파일하면 잘못된 경로가 표시됩니다.

아마도 이것을 비활성화하고 각 프로젝트의 dproj 파일에서 검색 경로를 명시 적으로 지정해야 할 것입니다.

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

이 내 추측이다. 5 년이 지나면 미안해. 나는 비슷한 문제로 고심하고있다! 모든 최고의

스티브