2017-12-27 14 views
1

Ich habe ein lokal Haskell Projekt verfasst, die beide produziert:Wie verwende ich den Stack, um lokal erstellte Haskell-Module für die globale Nutzung zu installieren?

  1. eine ausführbare Binärdatei, und
  2. mehrere neue Haskell-Module, die ich möchte zugänglich gemacht zu meinen anderen, Haskell basiert, ausführbare Dateien.

Nach:

stack build 
stack install 

Ich finde, dass:

  1. die ausführbare Binärdatei (# 1, oben) läuft aus einem beliebigen Verzeichnis nur in Ordnung.
  2. Aber die neuen Haskell-Module (# 2, oben) werden nur gefunden, wenn ich in meinem Projektverzeichnis laufe! (Das heißt, für jede andere ausführbare Datei als # 1, oben.)

Ich muss in der Lage sein, die neuen Module von überall zu finden. Wie kann ich das erreichen?

+0

klingt ähnlich wie [diese Frage nur ein paar Stunden früher] (https://stackoverflow.com/questions/47989939/is-there-a-deklarative-way-to-specify-packages-to-be-installed- into-global-proje), und wie dort würde ich vorschlagen, dass Sie Cabal-install anstelle von stack verwenden, dann müssen Sie sich nie darum sorgen, dass Modul-Installationen global werden. – leftaroundabout

+0

Danke für Ihren Kommentar. Ja, "cabal install" hat mein Problem gelöst. Aber jetzt habe ich zwei separate, parallele und weitgehend redundante Haskell-Installationen, die den Speicherplatz auf der Festplatte einfrieren, und das scheint schrecklich verschwenderisch und unnötig zu sein. Es ist besonders ärgerlich, weil die binäre ausführbare Datei, die ich produziere, von jedem Verzeichnis aus gut laufen kann, was bedeutet, dass es weiß, wie ich meine neuen Haskell-Module von überall auf meinem System finde (da es sie importiert). Warum kann ich diese neuen Module nicht auch anderen ausführbaren Haskell-Dateien zur Verfügung stellen ?! – dbanas

+0

Es ist absolut unnötig, deshalb verwende ich _only_ Cabal-install auf meinem Laptop und staple lediglich auf Travis. - Beachten Sie, dass die Art und Weise, wie Ihre ausführbare Datei importierte Module findet, sich sehr von der Art und Weise unterscheidet, wie der Compiler sie für eine Quelldatei findet. In der Tat, wenn Sie statisch verknüpfen, dann gibt es _isnot_ etwas, das external gefunden werden muss, da alles bereits in der Binärdatei enthalten ist. Wenn Sie dynamisch verknüpfen, wird ein fest codierter Pfad zu einer bestimmten Hash-Datei mit dynamischer Bibliothek angezeigt. Dies funktioniert jedoch nur, weil der Versions-Resolver und der Linker ihre Arbeit vor dem Handlesen erledigt haben. – leftaroundabout

Antwort

1

Jedes Stapelprojekt befindet sich in einer eigenen Sandbox, sodass die kompilierten Module nur innerhalb dieses Projekts verwendet werden können. Kompilierte Abhängigkeiten (die aus einem Stack-Snapshot stammen) werden manchmal zwischen Projekten ausgetauscht.

Beachten Sie, dass Sie einen relativen Pfad in der Paketliste auflisten und auf dieses Paket verweisen können. Es wird wieder aufgebaut, kann aber auf diese Weise direkt in einem anderen Projekt verwendet werden. Warum das extra Gebäude? Stack hat ein anderes Modell von Projekten als cabal-install - es lässt keine Mutationen in der Paket-DB zu, die sich auf die Erstellung anderer Projekte auswirken.

Eine Option zum Teilen eines solchen Pakets ist es in einem Git Repo zu haben und https://docs.haskellstack.org/en/stable/custom_snapshot/ zu verwenden, aber das Zeug ist noch ein bisschen neu.

+0

Danke für die Antwort. Also, wenn ich verstehe, was du sagst, klingt es wie Module, die für Haskell-Executables gebaut wurden, die einen dynamischen Plugin-Stil der Anpassung verwenden, sind einfach kein guter Kandidat für das Bauen/Installieren mit Stack. Sie sollten stattdessen mit Kabalen gebaut/installiert werden. Ist das eine faire Zusammenfassung? – dbanas

+0

Oh, ich wusste nicht, dass Sie versuchen, Module dynamisch zu laden. Wenn Sie "stack build pkg-x" in einem Projekt erstellen, stehen die Module innerhalb der Paket-DBs zur Verfügung, die in GHC_PACKAGE_PATH durch "stack exec" festgelegt wurden. Es klingt wie Sie wollen mehr globale Freigabe, aber bedenken Sie, dass für dynamische Plugins, Abhängigkeit Versionen müssen in einer Reihe, so sollte es in einem einzigen Stack-Projekt getan werden müssen ... Nein, Sie sollten wahrscheinlich nicht für Cabal verwenden Dies. Ziemlich sicher, das neue Build-Zeug würde das eigentlich ein bisschen unangenehmer machen, weil Sie eine bestimmte Paket-ID angeben müssten – mgsloan

+0

Danke! Ich möchte sicherstellen, dass ich verstehe: Also, was ich wirklich tun muss, ist diese "fremde" ausführbare Datei neu zu erstellen, nachdem ich meine neuen benutzerdefinierten Plugins zu ihrer Stack-Projektbeschreibung hinzugefügt habe. Ist das richtig? Mit anderen Worten, der Versuch, die ausführbare Datei unter Verwendung eines Stapelprojekts und der Plugins unter Verwendung eines anderen Stapelprojekts zu erstellen, ist ein inhärent fehlerhafter Ansatz. Wenn das korrekt ist, erscheint es für potentielle Plugin-Entwickler äußerst fragil und restriktiv. Ich dachte, dass dies eine gut entworfene/dokumentierte API (für die ausführbare Datei) verhindern sollte. Ich muss hier etwas Grundlegendes vermissen. – dbanas

Verwandte Themen