Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Nicht benötigte Units bereinigen (https://www.delphipraxis.net/209257-nicht-benoetigte-units-bereinigen.html)

horstmeyer 16. Nov 2021 10:32

Nicht benötigte Units bereinigen
 
Hallo zusammen,

ich suche nach einer einfachen Möglichkeit alle Units zu finden, die im aktuellen Projekt nicht angeprochen und somit nicht benötigt werden. Hat einer einen Tipp wie man dies am einfachsten bewerkstelligen kann? Vielen Dank.

Viele Grüße
Horst Meyer

Poelser 16. Nov 2021 10:42

AW: Nicht benötigte Units bereinigen
 
Hallo,

CN-Pack installieren, das ereugt dir im Menü einen Uses-Cleaner.

LG Edmund

Sinspin 16. Nov 2021 10:45

AW: Nicht benötigte Units bereinigen
 
Hallo,

so einfach ist das allerdings nicht.
Units haben
Delphi-Quellcode:
initialisation
und
Delphi-Quellcode:
finalization
Abschnitte. Schon ihre reine Anwesenheit im Projekt kann also den Programmablauf beeinflussen.
Zum Beispiel Units die weitere grafik-datei-formate bereitstellen. Die registrieren sich selbst, werden aber scheinbar nirgendwo verwendet.

BerndS 16. Nov 2021 10:51

AW: Nicht benötigte Units bereinigen
 
Zitat:

Units haben initialisation und finalization Abschnitte.
Das kann man im CN-Pack Uses Cleaner recht gut einstellen und eine Liste zu überspringender Units ist auch enthalten.

dummzeuch 16. Nov 2021 10:55

AW: Nicht benötigte Units bereinigen
 
Alternativ könnte man die Map-Datei überprüfen, aber:
  1. Ist das eine Menge manuelle Arbeit (ich kenne kein Tool dafür)
  2. werden dort Units, die keinen Code enthalten, aber z.B. Resource-Strings nicht aufgeführt

Uwe Raabe 16. Nov 2021 11:39

AW: Nicht benötigte Units bereinigen
 
Pascal Analyzer (auch die Lite Version) gibt dazu eine Übersicht. Da wird auch eventueller Implementation Code berücksichtigt - da muss man dann halt reinschauen ob man den braucht.

Delphi.Narium 16. Nov 2021 13:03

AW: Nicht benötigte Units bereinigen
 
Ausführliche MAP-Datei erstellen, alle Zeile, die mit Line numbers for beginnen, raussuchen. Sie enthalten alle Units, aus denen etwas ins Kompilat übernommen wurden.

Sollte für den Anfang eigentlich erstmal ausreichen.

Und wenn ich das bei meinem ollen Delphi 7 richtig sehe, sind Units, die nur Resource-Strings enthalten, auch in der MAP-Datei aufgeführt. Jedenfalls finde ich in den MAP-Dateien von Programmen, die Indy nutzen auch die IdResourceStringsCore.pas, und die enthält (neben Kommentaren) nur Resource-Strings.

Mal eben in PascalScript hingedaddelt:
Delphi-Quellcode:
program Test;

procedure CheckUnits(sFile : String);
var
  i      : Integer;
  s      : String;
  slMap  : TStringList;
  slUnits : TStringList;
begin
  slMap := TStringList.Create;
  slMap.LoadFromFile(sFile);
  slUnits := TStringList.Create;
  for i := 0 to slMap.Count - 1 do begin
    if Copy(slMap[i],1,16) = 'Line numbers for' then begin
      s := Copy(slMap[i],18,1024);
      s := Copy(s,1,Pos('(',s) - 1);
      slUnits.Add(s);
    end;
  end;
  slUnits.Sort;
  sFile := ChangeFileExt(sFile,'.UsedUnits');
  slUnits.SaveToFile(sFile);
  slUnits.Free;
  slMap.Free;
end;

begin
  CheckUnits('Programmname.map');
end.
Sollte so übernommen werden können.

Jens01 16. Nov 2021 14:55

AW: Nicht benötigte Units bereinigen
 
https://github.com/norgepaul/DUDS

Mit dem Delphi Unit Dependency Scanner mache ich das.
Der zeigt, u.a. von wie vielen Units die einzelne Unit genutzt wird. Wenn man den Trick raus hat, dann kann man sehr schön alle unnötigen Units aus dem Projekt werfen.
Alle Units, die nur von einer Unit -also von der DPR- genutzt werden, sind unnötig.

freimatz 16. Nov 2021 15:00

AW: Nicht benötigte Units bereinigen
 
Warum einfach wenn es auch umständlich geht. :wink:

Das einzig sinnvolle:

Zitat:

Zitat von Poelser (Beitrag 1497632)
Hallo,

CN-Pack installieren, das ereugt dir im Menü einen Uses-Cleaner.

LG Edmund


Uwe Raabe 16. Nov 2021 15:04

AW: Nicht benötigte Units bereinigen
 
Zitat:

Zitat von freimatz (Beitrag 1497666)
Das einzig sinnvolle:

Na ja, da kann man sicher geteilter Meinung sein.

Jens01 16. Nov 2021 15:05

AW: Nicht benötigte Units bereinigen
 
@freimatz
Damit wirfst Du die unnötigen Units aus einer Unit heraus, aber nicht aus dem Projekt.

freimatz 16. Nov 2021 15:11

AW: Nicht benötigte Units bereinigen
 
Das ist richtig. Das habe ich nicht berücksichtigt. Wozu das denn braucht - im Gegensatz zu uses zu cleanen - verstehe ich gerade nicht. Bei uns hat jedes Projekt einen eigenen Ordern und alle units liegen darin oder unterhalb.

Jens01 16. Nov 2021 15:19

AW: Nicht benötigte Units bereinigen
 
Im Projekt können auch Units drinstehen, die von keiner Unit genutzt werden. Da verliert man bei einem laufenden Projekt schnell den Überblick, gerade wenn man viel umbaut.

Nathan 18. Nov 2021 13:37

AW: Nicht benötigte Units bereinigen
 
Hallo zusammen

Noch eine Möglichkeit ist über die Compileroption "--symbol-report" von https://wiert.me/2019/01/31/passing-...-symbols-used/

Danach erzeugt der Compiler im DCU Path *.symbol_report Dateien. Sind XML und diese kann man analysieren.
Steht dort dann <uses> Tag ohne Client Nodes. Diese Unit's werden dann nicht verwendet. Beispiel:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<unit name="My.Plan">
  <uses name="Vcl.Grids">
  </uses>
</unit>
Beispielsweise steht in den Uses hier Unit Vcl.Grids, sie wird aber nicht verwendet.
Hatte mal versuche ein Projekt aufzusetzen das diese liest und entsprechend herausfiltert. Aber zeittechnisch nie weiter verfolgt.
Meine ersten Versuche damit liegen unter https://github.com/Thurnreiter/Gener...tDependency.V2

Ziel von mir war es, das im Buildprozess zu automatisieren.

Thx und Gruss
Nathan

Redeemer 19. Nov 2021 00:00

AW: Nicht benötigte Units bereinigen
 
Gerade mal PAL Lite gestartet und folgende Probleme festgestellt:
  • Kennt keine Class Helper und will alle Uses rausschmeißen, die nur deshalb verwendet werden.
  • Kommt bei IfThen zwischen StrUtils und Math durcheinander und schlägt das Entfernen einer der beiden vor, wenn sonst nichts daraus verwendet wird.
  • Unterstützt keine Datenmodule, welche ImageLists, PopupMenus usw. bereitstellen. Diese sind nicht zwangsläufig notwendig, aber es ist schon seltsam, wenn man im Objektinspektor PopupMenus, ImageLists usw. als Wert angezeigt bekommt, die in der zugehörigen Dropdownliste fehlen.
Sind das speziell Probleme der Lite-Version?

Mein Hauptprojekt in der Firma (gut 11 MiB EXE, D2010) war früher erzeugt 300 KB kleiner als compiliert. Jetzt nach dem Löschen von Uses ist es erzeugt etwa so groß wie vorher compiliert und compiliert 50 KB kleiner als erzeugt, also genau andersrum wie vorher und in jedem Fall größer. Sehr seltsam.

Uwe Raabe 19. Nov 2021 09:48

AW: Nicht benötigte Units bereinigen
 
Zitat:

Zitat von Redeemer (Beitrag 1497835)
Kennt keine Class Helper und will alle Uses rausschmeißen, die nur deshalb verwendet werden.

Ich habe das mal mit der Vollversion getestet und bis auf diesen Punkt auch nachvollziehen können. Daher bin ich mir nicht sicher, ob ich das richtig verstanden habe.

Mein Test Case ist eine Unit, die lediglich einen Class Helper enthält, dessen Methode dann in einer anderen Unit benutzt wird:
Delphi-Quellcode:
uses
  System.Classes;

type
  TComponentHelper = class helper for TComponent
  public
    function IsDataModule: Boolean;
  end;
Im Gegensatz zu dem von dir beschriebenen Verhalten, empfiehlt PAL hier nicht die Unit zu entfernen.

Abgesehen von der Lite Version, was ist bei dir anders?

Redeemer 19. Nov 2021 11:04

AW: Nicht benötigte Units bereinigen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hab ein Beispiel angehängt. Unit2 definiert einen Class Helper, deren einzige Methode ich in Unit1 aufrufe. In dem Fall von einem Nachkommen, aber PAL funktioniert meines Wissens auch dann nicht, wenn es sich um die Klasse selbst handelt, die einen Class Helper bekommen hat.

(Das ist D2010.)

Uwe Raabe 19. Nov 2021 13:42

AW: Nicht benötigte Units bereinigen
 
Danke, mit dem Beispiel kann ich es auch mit der Vollversion reproduzieren. Ich werde das an den Entwickler weitergeben.

Redeemer 19. Nov 2021 14:52

AW: Nicht benötigte Units bereinigen
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1497859)
Ich werde das an den Entwickler weitergeben.

Danke. Alle drei?

Uwe Raabe 19. Nov 2021 14:53

AW: Nicht benötigte Units bereinigen
 
Zitat:

Zitat von Redeemer (Beitrag 1497863)
Alle drei?

Na klar.

Uwe Raabe 13. Dez 2021 16:13

AW: Nicht benötigte Units bereinigen
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1497859)
Ich werde das an den Entwickler weitergeben.

So, die neue Version 9.9.1.0 des Pascal Analyzer macht das nun auch richtig.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz