O destino de compilação personalizado do Delphi XE está sempre desativado

177

Criei um .targetsarquivo MSBuild personalizado que incluímos em um projeto Delphi XE por meio do IDE e o habilitei no menu de contexto do gerente de projeto. Embora o arquivo valide, ele sempre será desativado depois que eu salvar novamente o arquivo do projeto.

Aqui está uma versão simplificada do arquivo de alvos, com o nome Custom.targets.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="Hello">
    <Message Text="Hello from custom target"/>
  </Target>
</Project>

Como um arquivo autônomo, isso funciona conforme o esperado: digitando ...

MSBuild Custom.target /t:Hello

... na linha de comando, fornece a mensagem esperada.

Adicionar Custom.targetsum projeto Delphi via IDE exibe o arquivo no gerente de projeto conforme o esperado, e o .dprojarquivo agora contém a linha ...

<TargetsFile Include="Custom.targets"/>

Clique com o botão direito do mouse no arquivo no Gerenciador de projetos do IDE e selecione Enable. Mas quando o projeto é construído, a Buildjanela de mensagem é exibida:

[MSBuild Warning] Custom.targets (1): Ignorando a importação desabilitada: PathToProjectSource\\Custom.targets

Clicar com o botão direito do mouse novamente no Gerenciador de projetos ainda mostra a Enableopção em vez da esperada Disable.

Na linha de comando MSBuild ProjectName.dproj /t:Hellotambém falha.

Eu tentei invadir o .dprojarquivo para adicionar a linha ...

<Import Project="Custom.targets"/>

Digitar MSBuild ProjectName.dproj /t:Helloagora funciona. Mas na próxima vez que eu salvar o arquivo do projeto no IDE, a <Import>instrução será removida.

Alguém tem alguma idéia do que está errado, por favor?

delphidabbler
fonte
10
No seu exemplo de uso do msbuild na linha de comando, você mostra Custom.target enquanto em qualquer outro lugar você usa Custom.targets . Qual é?
21914 Kenneth Cochran
4
Bom ponto - eu não tinha notado isso, apesar de muito olhar para o código. Não consigo acessar uma máquina com Delphi por alguns dias (no hospital!), Mas tentarei o código usando "target" ou "target" consistentemente quando posso.
Delphidabbler 16/03/14
6
Não é um usuário Delphi, mas de acordo com isso, todos os arquivos .targets devem conter scripts válidos do MSBuild, livres de erros. Se o arquivo tiver algum erro, você será notificado e, se o projeto fizer referência ao arquivo .targets inválido, ele será desativado e não poderá ser reativado até que os erros sejam corrigidos. Pode valer a pena verificar duas vezes se tudo está correto, pois isso explica os sintomas que você está recebendo.
precisa
Infelizmente, no XE7, não consigo reproduzir o seu problema, tudo parece funcionar como esperado: construindo a partir do prompt da linha de comando /t:Helloe do IDE com o botão direito do mouse em Gerente de Projeto - Destinos - Olá. Eu adicionei Custom.targetsao projeto clicando com o botão direito no Project Manager - Add - (navegados para o arquivo). O caminho é o mesmo diretório que o arquivo .dproj.
Ondrej Kelle

Respostas:

1

O Delphi gera todo o conteúdo do dproj e essa importação personalizada sempre será excluída.

Você pode escrever seus próprios arquivos xml msbuild, mas o dproj pertence ao Delphi.

A menos que você tenha código-fonte ou esteja disposto a corrigir o código, você não pode fazer isso.

Se você realmente quer uma maneira xml flexível para criar projetos delphi e criar alvos em abundância, tente ou queira vnext (meu fork no bitbucket)

Warren P
fonte
1

Eu incluiria o arquivo de destinos manualmente e construiria externamente usando o MSBuild, e não a partir do IDE, porque, ao compilar a partir do IDE, é um pouco confuso saber qual configuração e destino você aplicou (foi o que clicou no projeto? destino ativado? você não recebe nenhuma dica visual de que um destino personalizado está ativado).

Eu costumo fazer isso antes Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets"para que eles não apareçam no IDE (eles existem, mas estão ocultos para os desenvolvedores).

Por exemplo, meus projetos Delphi XE4 terminam com:

    <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>

Meu arquivo .targets define um "PropertyGroup" e um "Target" personalizados com uma condição, portanto eles serão aplicados somente quando chamados no 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>

Em seguida, compile-o com:

msbuild /t:CustomTarget /p:config=CustomConfig poject.dproj

O uso dessa abordagem permite personalizar os alvos de compilação para garantir que todos os aplicativos obtenham as configurações corretas sem serem afetados pelas alterações feitas por ninguém.

Fran
fonte