2013-08-06 12 views
16

Czy można powiedzieć, że wszystkie moduły są udostępniane podczas budowania biblioteki?Cabal - Expose all modules while building library

W tej chwili muszę dostarczyć bardzo długą listę modułów w sekcji pliku konfiguracyjnego cab Exposed-modules.

+0

Pytasz, jak włączyć moduł do projektu kabalowego, nie wspominając o nim w pliku '.cabal'? – Heatsink

+0

@Heatsink, nie - Jeśli kompilujesz bibliotekę z kabałą, musisz napisać plik konfiguracyjny '<...> .cabal'. W tym pliku musisz podać sekcję 'Exposed-modules', w której musisz wyświetlić ** każdy ** moduł, który chcesz eksponować. Chcę wystawić ** wszystkie ** moduły. –

+0

To nie odpowiada na moje pytanie. Każdy moduł musi być wymieniony w pliku '.cabal'. Również moduły wewnętrzne muszą być wymienione w "Inne moduły". Czy pytasz o alternatywne sposoby wyświetlania wszystkich modułów, czy też pytasz o sposoby korzystania z modułu bez jego wymieniania? – Heatsink

Odpowiedz

6

Nowoczesna odpowiedź to stack + hpack zamiast używania jawnej konfiguracji cabal. Może automatycznie eksponować moduły pakietów i zapewnia wiele innych ulepszeń.

8

Należy podać wszystkie moduły w pliku konfiguracyjnym cabal. W twoim przypadku wystarczy umieścić listę modułów po exposed-module:. Nie ma prostszego sposobu na napisanie listy modułów.

Cabal nie może automatycznie znaleźć plików, które są częścią pliku wykonywalnego lub biblioteki, więc opiera się na liście modułów w pliku konfiguracyjnym. W przeciwieństwie do GHC, cabal nie może znaleźć modułów opartych na instrukcjach importu w kodzie źródłowym. Jeśli nie podasz wszystkich modułów, możesz zbudować projekt (ponieważ GHC może znaleźć pliki źródłowe), ale inne polecenia, takie jak cabal sdist, nie będą miały dostępu do plików źródłowych, których nie ma na liście.

+8

Jeśli uruchomisz 'cabal init' na drzewie źródłowym niemetralizowanym, zapełni ono' wyeksponowane ' moduły 'automatycznie, ale nadal będziesz musiał ręcznie zaktualizować pole. –

+12

@MikhailGlushenkov To całkiem niedorzeczne. Może on parsować instrukcje importu na "init" (którego prawdopodobnie nikt nigdy nie używa), ale nie może zrobić tego samego dla żadnego innego polecenia. To zdecydowanie problem. –

+2

Czy są jakieś narzędzia zewnętrzne, które mogą aktualizować "narażone moduły"? Lub może "stos" to zrobić? –