Почему "использует единицу измерения" исчезает, когда у меня появилась новая единица измерения?
Вопрос
У меня есть проект модульного тестирования для моего приложения с использованием 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 осведомлена об этой проблеме.
Подумайте о том, чтобы иметь два проекта.Один раз с дополнительным кодом, другой - без.Затем создайте то, что вы хотите, или и то, и другое.Используя проектные группы, они будут работать хорошо.