Ist es zwingend erforderlich, dass ein Ordner mit dem Namen eines Pakets für die Erstellung eines Pakets vorhanden sein sollte?

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

  •  19-08-2019
  •  | 
  •  

Frage

Wir sind Factoring den gemeinsamen Code aus unserem Perl-Projekt aus. Ein Hauptprogramm sollte in mehr wiederverwendbaren Module aufgeteilt werden.

Unser Programm Name ist validate_results.pl die Validierungsbefehle Set enthält. Wir planen, diese in kleine Module aufgeteilt, so dass validate_results.pl sein sollte:

use Common::Validate_Results;
use Common::Validate_Results::CommonCommands;
use Common::Validate_Results::ReturnCodeValidation;
...

Wie pro meinem Verständnis soll ich einen gemeinsamen Ordner erstellen und unter diesem Validate_Results.pm sollte vorhanden sein. Wieder unter Common, Validate_Results Ordner erstellt und unter diesen CommonCommands und ReturnCodeValidation werden sollten Ordner sollten vorhanden sein.

Ist es zwingend erforderlich, dass alle diese Ordner vorhanden sein sollten oder können wir alle Perl-Programme in einem einzigen Ordner und logisch gruppieren und immer noch die oben beschriebene Weise die Module für den Zugriff auf (sagen wir verwenden common::validate_results ähnlich).

War es hilfreich?

Lösung

Die Dateisystem-Hierarchie ist nicht erforderlich. A :: B :: C wird immer in A / B / C.pm befindet, irgendwo in @INC.

Wenn Sie Haben , dies zu umgehen, lesen Sie perldoc -f erfordert, die speziell für den Abschnitt über Unterprogramm Referenzen in @INC suchen. Ja, können Sie die Modul-Lader seltsame Dinge machen tun, wenn das ist, was Sie wirklich wollen; aber das ist nicht das, was Sie wollen, vertrauen Sie mir. Just-Stick auf den Kongress, wie das andere 99.9999999% der Perl-Anwendungen zu tun.

Andere Tipps

Wenn Sie möchten, um Ihre Module ‚verwenden‘, dann müssen Sie an der Struktur entsprechen. Wenn Sie umgehen möchten, dass Sie ‚benötigen‘ Ihre Module stattdessen den Dateinamen geben müssen.

Sie wirklich sollten dies nicht tun, wenn. Wenn Sie wirklich nicht wollen, eine Verzeichnisstruktur haben, nehmen Sie es aus dem Modulnamen (obwohl das zu Problemen in der Zukunft führen kann, wenn Sie jemals einen Modulnamen, die mit etwas mehr Generika von CPAN Konflikten). Fügen Sie einfach die Skripte Verzeichnis der INC-Pfad über Suche :: Bin und verwenden Sie die Module direkt an:

use FindBin;
use lib $FindBin::Bin;

use ValidateResults;
use CommonCommands;
use ReturnCodeValidation;

HTH

Hier ist ein Beispiel eines Moduls und es ist Submodule in der gleichen Datei:

package Foo;
use strict;
use Exporter 'import';

our @EXPORT = ( 'from_foo' );

sub from_foo { print "from_foo\n"; }

package Foo::Bar;
use strict;
use Exporter 'import';

our @EXPORT = ( 'from_foo_bar' );

sub from_foo_bar { print "from_foo_bar\n"; }

1;

In Ihrem Programm, wenn Sie verwenden Modul Foo (die mit einer .pm-Datei):

use Foo;

Sie haben Zugang haben Foo :: Bar Funktionen, mit Ausnahme nur als kanonischer Name (Foo :: Bar :: from_foo_bar). Sie können sie wie folgt importieren:

use Foo;
Foo::Bar->import;

Beachten Sie, dass Sie dies nicht tun:

use Foo::Bar;

Da es keine Datei Foo / Bar.pm .

Der Paketname in einem Befehl ‚Verwendung‘ ist effektiv nur ein Weg, der mit einer .pm Datei endet, so dass Sie nicht einen Ordner mit dem Namen jedes Paket. In Ihrem Beispiel, müssen Sie Ordner:

Common
Common/Validate_Results

Aber Sie keine Ordner benötigen:

Common/Validate_Results/CommonCommands
Common/Validate_Results/ReturnCodeValidation

Die tatsächlichen Paketnamen in der .pm Datei nicht die gleichen wie der Name in dem ‚Verwendung‘ Befehl sein, die es lädt. Aber halten die Wege im Einklang mit den Paketnamen ist immer eine gute Idee.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top