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

프로젝트 관리자에서 마우스 오른쪽 버튼을 다시 클릭하면 여전히 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 를 사용 합니다 . 무엇 이니?
케네스 코크란

4
좋은 자리-코드를 많이 쳐다 보았지만 그 사실을 알지 못했습니다. 며칠 동안 (병원에서) 델파이가있는 머신에 접근 할 수 없지만 가능한 한 "target"또는 "targets"를 사용하여 코드를 시도합니다.
delphidabbler

6
델파이 사용자는 아니지만 모든 .targets 파일에는 오류가없는 유효한 MSBuild 스크립트가 포함되어야합니다. 파일에 오류가 있으면 알림이 표시되고 프로젝트가 잘못된 .targets 파일을 참조하는 경우 해당 파일이 비활성화되고 오류가 해결 될 때까지 다시 활성화 할 수 없습니다. 증상이 나타나기 때문에 모든 것이 올바른지 다시 확인해야 할 수도 있습니다.
Daniel Morritt 2016 년

불행히도 XE7에서는 문제를 재현 할 수 없습니다. 모든 것이 예상대로 작동하는 것 같습니다 /t:Hello. 프로젝트 관리자-대상-Hello에서 마우스 오른쪽 버튼을 클릭하여 명령 프롬프트와 IDE에서 빌드 하십시오. Custom.targets프로젝트 관리자-추가-(파일 찾아보기)를 마우스 오른쪽 버튼으로 클릭하여 프로젝트에 추가 했습니다. 경로는 .dproj 파일과 동일한 디렉토리입니다.
Ondrej Kelle

답변:


1

Delphi는 전체 dproj 컨텐츠 자체를 생성하며이 사용자 정의 가져 오기는 항상 삭제됩니다.

자신의 msbuild xml 파일을 작성할 수 있지만 dproj는 Delphi에 속합니다.

소스 코드가 없거나 원숭이 패치를 기꺼이 적용하지 않는 한 그렇게 할 수 없습니다.

델파이 프로젝트를 빌드하고 많은 목표를 생성하는 유연한 XML 방법을 원한다면 vnext (비트 버킷의 포크)를 사용해보십시오.


1

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.