Почему "использует единицу измерения" исчезает, когда у меня появилась новая единица измерения?

StackOverflow https://stackoverflow.com/questions/2555259

  •  23-09-2019
  •  | 
  •  

Вопрос

У меня есть проект модульного тестирования для моего приложения с использованием DUnit framework.В этом проекте есть блок, окруженный $IFDEF выводить результаты тестирования в xml-файл вместо графического интерфейса пользователя или просто командной строки.Определение XML_OUTPUT включается путем переключения конфигурации сборки.

program DelphiCodeToDoc_Tests;

uses
  TestFramework,
  TextTestRunner,
  Sysutils,
  Forms,
  GUITestRunner,
{$IFDEF XML_OUTPUT}
  XmlTestRunner2 in 'DUnit_addon\XmlTestRunner2.pas',
{$ENDIF}
  DCTDSetupTests in 'IntegrationTests\DCTDSetupTests.pas',
  ...

Это работает идеально.Проблема начинается когда я добавляю новый модуль в этот проект из IDE (новый модуль с помощью 'File>New>Unit').

Тестовый проект сейчас находится :

uses
  TestFramework,
  TextTestRunner,
  Sysutils,
  Forms,
  GUITestRunner,
  DCTDSetupTests in 'IntegrationTests\DCTDSetupTests.pas',
  ...
  MyNewUnit in 'IntegrationTests\MyNewUnit.pas';

Как вы видите, тестовый XML_OUTPUT исчез ...Каждый раз, когда я добавляю модуль, среда разработки Delphi удаляет этот тест.

Знаете ли вы , почему и как я могу избежать этого ?

Это было полезно?

Решение

В ваше приложение в любом случае компилируется только тот код, который фактически используется, поэтому, как правило, наличие модулей в Uses предложения, которые не используются.

Вы можете увидеть весь код, который связан с вашим приложением, когда запускаете программу в своей IDE.Вы должны увидеть синие точки рядом со всем скомпилированным кодом.

Единственное предостережение заключается в том, что вы должны проверить initialization раздел единиц измерения, которые вызывают озабоченность.Любой код, находящийся в разделе инициализации, включается автоматически, просто путем включения модуля, потому что любой код в этом разделе запускается сразу же после запуска приложения.Вы могли бы добавить свою директиву компилятора внутри раздела инициализации модуля, если это необходимо, чтобы избежать связывания и запуска любого кода инициализации.

Другие советы

Вы можете добавить прокси-модуль в основную программу, чтобы обойти это проблемное поведение (которое многие из нас считают ошибкой, а не функцией).

program DelphiCodeToDoc_Tests;

uses
  ...
  XMLTestRunnerProxy,  
  ...

и

unit XMLTestRunnerProxy;

interface

{$IFDEF XML_OUTPUT}
uses
  XmlTestRunner2 in 'DUnit_addon\XmlTestRunner2.pas';
{$ENDIF}

implementation

end.

В ДНР использование список управляется IDE.К сожалению, вы ничего не можете с этим поделать.Официально, вы не должны помещать IFDEFs в середину DPR использование перечислите, потому что он будет делать подобные вещи, если вы это сделаете.

Что бы я сделал, так это оставил модуль XmlTestRunner2 в проекте и поместил IFDEFs внутри самого модуля, чтобы, если у вас не установлен XML_OUTPUT, он ничего не компилировал.

Удаление происходит каждый раз, когда IDE должна изменить предложение DPR USES.Использование "Сохранить как" для переименования объекта приведет к тому же самому.

Чтобы обойти это, я всегда создаю свои новые модули извне в виде пустого текстового файла, а затем добавляю их в DPR вручную.Поначалу это требует немного больше работы, но в конечном итоге вы включаете модули только в том случае, если они необходимы.Также обратите внимание, что когда это произойдет, если вы используете что-либо более позднее, чем Delphi 2005, вы можете переключиться на вкладку "История" в нижней части панели редактирования и скопировать содержимое "Локального файла", чтобы получить версию, предшествующую тому, когда модуль был добавлен, а все остальное удалено.

И да, это ошибка. Контрольный вопрос #6294 в частности, и он открыт, так что Embarcadero осведомлена об этой проблеме.

Подумайте о том, чтобы иметь два проекта.Один раз с дополнительным кодом, другой - без.Затем создайте то, что вы хотите, или и то, и другое.Используя проектные группы, они будут работать хорошо.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top