我寫了幾個模塊,我經常想複製到其他項目中以重用代碼。但是,如果我簡單地複製這些模塊,那麼如果我想要改進它們,我將不得不更新各個git存儲庫中所有使用它們的項目的副本。在多個項目中重用Haskell代碼
看來我應該創建某種圖書館。我如何設置我的項目,以便我只需要更新這些模塊一次,並且所有依賴它們的存儲庫都可以訪問最新版本?
我寫了幾個模塊,我經常想複製到其他項目中以重用代碼。但是,如果我簡單地複製這些模塊,那麼如果我想要改進它們,我將不得不更新各個git存儲庫中所有使用它們的項目的副本。在多個項目中重用Haskell代碼
看來我應該創建某種圖書館。我如何設置我的項目,以便我只需要更新這些模塊一次,並且所有依賴它們的存儲庫都可以訪問最新版本?
將包裝中的模塊捆綁在一起(或可能製作單模塊包裝)。如果你之前沒有這樣做,read the Cabal user guide。與其他代碼一樣,每個軟件包都應該受版本控制(git,darcs等),儘管這對於您的需求並不嚴格需要。
假設有一個這樣的包,foo
,含有該模塊Common.Foo
和Common.Foo.Types
,即有一個包含Common/Foo.hs
和Common/Foo/Types.hs
的文件夾和文件foo.cabal
與exposed-modules: Common.Foo Common.Foo.Types
。
的項目要使用Common.Foo
應該再也是陰謀包和,除了在Haskell的源文件中的明顯import Common.Foo
,應該有一個.cabal
文件,build-depends: foo
。
然後,當你已經改變了foo
封裝的模塊,你可以只輸入cabal install --force-reinstalls
†(從內foo
小號目錄)。這將更新本地軟件包註冊表,然後當您使用foo
的另一個項目cabal configure
和cabal build
時,它將有權訪問這些更改。
也考慮實際publishing your package on Hackage(當然,一定要真正給它一個明確,描述名!),那麼你甚至不會擔心越來越來源,當你切換到另一臺機器上編譯 - cabal可以爲你做到這一點。
†的--force-reinstalls
只有你也已經經過必要install
編依賴於foo
的包之一。在重新安裝foo
後,您必須必須然後重建這些 - 這是cabal-install寄存器安裝方式中的一個缺陷。這將在未來的become unnecessary。
因此,依賴包將能夠找到'foo',因爲它被輸入到這個「本地包註冊表」中? –
正在處理。 – leftaroundabout
也許藉此機會提一下'stack'? – SwiftsNamesake
除了@ leftroundabout的出色答卷,還有通過添加路徑到你stack.yaml
添加使用stack
本地依賴性的另一種方式:
flags: {}
packages:
- '.'
- location: path/to/my/incredible/haskell/goodies
- location:
git: url/to/my/fp/repository
commit: [commit-hash]
extra-dep: true
[etc., etc.]
假設你有沒有聽說過這個工具已經(其中主要是解決臭名昭着的陰謀問題),我強烈建議檢查出來。
你用什麼來建立你的代碼?堆棧還是Cabal? – arrowd
你可以建立鏈接(如果你的文件系統支持的話)到這些文件上,以便在一個地方更新它,這意味着它也可以在其他地方更新。 –
@arrowd Cabal,雖然這可能會改變我猜 –