2017-07-30 53 views
0

我寫了幾個模塊,我經常想複製到其他項目中以重用代碼。但是,如果我簡單地複製這些模塊,那麼如果我想要改進它們,我將不得不更新各個git存儲庫中所有使用它們的項目的副本。在多個項目中重用Haskell代碼

看來我應該創建某種圖書館。我如何設置我的項目,以便我只需要更新這些模塊一次,並且所有依賴它們的存儲庫都可以訪問最新版本?

+0

你用什麼來建立你的代碼?堆棧還是Cabal? – arrowd

+0

你可以建立鏈接(如果你的文件系統支持的話)到這些文件上,以便在一個地方更新它,這意味着它也可以在其他地方更新。 –

+0

@arrowd Cabal,雖然這可能會改變我猜 –

回答

6

將包裝中的模塊捆綁在一起(或可能製作單模塊包裝)。如果你之前沒有這樣做,read the Cabal user guide。與其他代碼一樣,每個軟件包都應該受版本控制(git,darcs等),儘管這對於您的需求並不嚴格需要。

假設有一個這樣的包,foo,含有該模塊Common.FooCommon.Foo.Types,即有一個包含Common/Foo.hsCommon/Foo/Types.hs的文件夾和文件foo.cabalexposed-modules: Common.Foo Common.Foo.Types

的項目要使用Common.Foo應該再也是陰謀包和,除了在Haskell的源文件中的明顯import Common.Foo,應該有一個.cabal文件,build-depends: foo

然後,當你已經改變了foo封裝的模塊,你可以只輸入cabal install --force-reinstalls(從內foo小號目錄)。這將更新本地軟件包註冊表,然後當您使用foo的另一個項目cabal configurecabal build時,它將有權訪問這些更改。

也考慮實際publishing your package on Hackage(當然,一定要真正給它一個明確,描述名!),那麼你甚至不會擔心越來越來源,當你切換到另一臺機器上編譯 - cabal可以爲你做到這一點。


--force-reinstalls只有你也已經經過必要install編依賴於foo的包之一。在重新安裝foo後,您必須必須然後重建這些 - 這是cabal-install寄存器安裝方式中的一個缺陷。這將在未來的become unnecessary

+0

因此,依賴包將能夠找到'foo',因爲它被輸入到這個「本地包註冊表」中? –

+0

正在處理。 – leftaroundabout

+0

也許藉此機會提一下'stack'? – SwiftsNamesake

2

除了@ 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.] 

假設你有沒有聽說過這個工具已經(其中主要是解決臭名昭着的陰謀問題),我強烈建議檢查出來。

相關問題