Por que 'usa unidade' desaparece quando eu tinha uma nova unidade?
Pergunta
Eu tenho um projeto de teste de unidade para meu aplicativo usando a estrutura Dunit. Este projeto tem uma unidade cercada por um $IFDEF
Para produzir resultados de teste em um arquivo XML em vez da GUI ou apenas linha de comando. XML_Output Definy é ativado alternando a configuração de compilação.
program DelphiCodeToDoc_Tests;
uses
TestFramework,
TextTestRunner,
Sysutils,
Forms,
GUITestRunner,
{$IFDEF XML_OUTPUT}
XmlTestRunner2 in 'DUnit_addon\XmlTestRunner2.pas',
{$ENDIF}
DCTDSetupTests in 'IntegrationTests\DCTDSetupTests.pas',
...
Isso funciona perfeitamente. O problema começa Quando estou adicionando uma nova unidade a este projeto A partir do IDE (uma nova unidade com 'arquivo> nova> unidade').
O projeto de teste é agora:
uses
TestFramework,
TextTestRunner,
Sysutils,
Forms,
GUITestRunner,
DCTDSetupTests in 'IntegrationTests\DCTDSetupTests.pas',
...
MyNewUnit in 'IntegrationTests\MyNewUnit.pas';
Como você vê, o teste XML_Output desapareceu ... Cada vez que estou adicionando uma unidade, o Delphi IDE exclui esse teste.
Você sabe por que e como posso evitá -lo?
Solução
Somente o código que é realmente usado é compilado em seu aplicativo de qualquer maneira, então normalmente, não dói ter unidades no Uses
Cláusula que não é usada.
Você pode ver todo o código vinculado ao seu aplicativo quando você executa o programa dentro do seu IDE. Você deve ver pontos azuis ao lado de todo o código compilado.
A única ressalva é que você deve verificar o initialization
Seção das unidades que são preocupantes. Qualquer código que esteja na seção de inicialização é automaticamente incluído simplesmente incluindo a unidade porque qualquer código nessa seção é executado assim que o aplicativo é iniciado. Você pode adicionar sua diretiva do compilador na seção de inicialização da unidade, se necessário, para evitar que qualquer código de inicialização seja vinculado e executado.
Outras dicas
Você pode adicionar uma unidade de proxy ao programa principal para ignorar esse comportamento problemático (que muitos de nós consideramos um bug, não um recurso).
program DelphiCodeToDoc_Tests;
uses
...
XMLTestRunnerProxy,
...
e
unit XMLTestRunnerProxy;
interface
{$IFDEF XML_OUTPUT}
uses
XmlTestRunner2 in 'DUnit_addon\XmlTestRunner2.pas';
{$ENDIF}
implementation
end.
Os DPRs usos A lista é gerenciada pelo IDE. Infelizmente, não há nada que você possa fazer sobre isso. Oficialmente, você não deveria colocar o IFDefs no meio dos DPRs usos Liste porque fará coisas assim, se você fizer.
O que eu faria é deixar a unidade xmltestUnner2 no projeto e colocar os ifdefs dentro da própria unidade, para que, se você não tiver um conjunto de XML_Output, ele não compila nada.
A remoção ocorre sempre que o IDE precisar modificar a cláusula de usos do DPR. Usar "Salvar como" para renomear uma unidade fará a mesma coisa.
Para contorná -lo, sempre crio minhas novas unidades externamente como um arquivo de texto vazio e as adiciono ao DPR manualmente. É um pouco mais de trabalho inicialmente, mas você acaba incluindo apenas as unidades, se necessário. Observe também que, quando isso acontecer se você estiver usando algo mais tarde que o Delphi 2005, você poderá mudar para a guia "Histórico" na parte inferior do painel de edição e copiar o conteúdo do "arquivo local" para obter a versão antes de quando a unidade foi adicionado e tudo mais despojado.
E sim, isso é um bug. QC#6294 Especificamente, e está aberto, então Embarcadero está ciente do problema.
Considere ter dois projetos. Uma vez com o código opcional, um sem. Em seguida, construa o que quiser, ou ambos. Usando grupos de projeto, eles funcionarão bem.