可在库中执行,同时在 cabal 中使用相同的库
Executable within a library and while using the same library in cabal
这是我第一次尝试开源项目,但我仍然无法找到设置 .cabal
文件的正确方法。
我有库、可执行文件和(即将推出的)测试配置。
我想在可执行文件中使用库和文件,所以下载后两者都可以使用。
我遵循了这个 guide,但我仍在为 cabal-config 苦苦挣扎,因为我只是在再次导入所有内容时才让它工作。
我的当前目录
- src/
- Main.hs
- Format/
- C.hs
- Converter.hs
- Raw.hs
- RGB565.hs
- tests/...
- dist/...
- UTFTConverter.cabal
可执行文件 Main.hs header 看起来像这样。
module Main where
import Format.C
import Format.Converter
格式/中的库文件如下所示。
module Format.{filename} where
...
这就是 cabal 文件的样子。
name: UTFTConverter
...
cabal-version: >=1.10
library
exposed-modules: Format.C
, Format.Converter
, Format.Raw
, Format.RGB565
build-depends: base >=4.7 && <4.8
, filepath >=1.3 && <1.4
, directory >=1.2 && <1.3
, time >=1.4 && <1.5
, bytestring >=0.10 && <0.11
, JuicyPixels >=3.2 && <3.3
hs-source-dirs: src
...
executable UTFTConverter
main-is: Main.hs
build-depends: base >=4.7 && <4.8
, filepath >=1.3 && <1.4
, directory >=1.2 && <1.3
, time >=1.4 && <1.5
, bytestring >=0.10 && <0.11
, JuicyPixels >=3.2 && <3.3
--, UTFTConverter ==0.1 <-- this does not work
hs-source-dirs: src
...
test-suite tests:
...
如果没有注释,当我 cabal build
.
时会出现此错误
...
cabal: At least the following dependencies are missing:
UTFTConverter ==0.1
...
它现在可以工作,但在教程中,可执行文件使用的是同一个 cabal 文件中的库。
executable bassbull
main-is: Main.hs
ghc-options: -rtsopts -O2
build-depends: base,
bassbull, -- <-- this is the name of the library
bytestring,
cassava
hs-source-dirs: src
default-language: Haskell2010
我知道这目前有效,但我宁愿从一开始就以正确的方式使用它。这是 "right" 方式吗?
这是因为您的库版本是 0.1.0.0
,而不是 0.1
。它们不完全匹配,因此 cabal 不会将您的图书馆识别为候选者。相反,根据您的版本策略使用 0.1.*
或 0.1.0.0
:
executable UTFTConverter
main-is: Main.hs
build-depends: base >=4.7 && <4.8
, filepath >=1.3 && <1.4
, directory >=1.2 && <1.3
, time >=1.4 && <1.5
, bytestring >=0.10 && <0.11
, JuicyPixels >=3.2 && <3.3
, UTFTConverter ==0.1.0.0
hs-source-dirs: src
参考资料
- Cabal User Guide,部分 "Build Information"。
这是我第一次尝试开源项目,但我仍然无法找到设置 .cabal
文件的正确方法。
我有库、可执行文件和(即将推出的)测试配置。 我想在可执行文件中使用库和文件,所以下载后两者都可以使用。
我遵循了这个 guide,但我仍在为 cabal-config 苦苦挣扎,因为我只是在再次导入所有内容时才让它工作。
我的当前目录
- src/
- Main.hs
- Format/
- C.hs
- Converter.hs
- Raw.hs
- RGB565.hs
- tests/...
- dist/...
- UTFTConverter.cabal
可执行文件 Main.hs header 看起来像这样。
module Main where
import Format.C
import Format.Converter
格式/中的库文件如下所示。
module Format.{filename} where
...
这就是 cabal 文件的样子。
name: UTFTConverter
...
cabal-version: >=1.10
library
exposed-modules: Format.C
, Format.Converter
, Format.Raw
, Format.RGB565
build-depends: base >=4.7 && <4.8
, filepath >=1.3 && <1.4
, directory >=1.2 && <1.3
, time >=1.4 && <1.5
, bytestring >=0.10 && <0.11
, JuicyPixels >=3.2 && <3.3
hs-source-dirs: src
...
executable UTFTConverter
main-is: Main.hs
build-depends: base >=4.7 && <4.8
, filepath >=1.3 && <1.4
, directory >=1.2 && <1.3
, time >=1.4 && <1.5
, bytestring >=0.10 && <0.11
, JuicyPixels >=3.2 && <3.3
--, UTFTConverter ==0.1 <-- this does not work
hs-source-dirs: src
...
test-suite tests:
...
如果没有注释,当我 cabal build
.
...
cabal: At least the following dependencies are missing:
UTFTConverter ==0.1
...
它现在可以工作,但在教程中,可执行文件使用的是同一个 cabal 文件中的库。
executable bassbull
main-is: Main.hs
ghc-options: -rtsopts -O2
build-depends: base,
bassbull, -- <-- this is the name of the library
bytestring,
cassava
hs-source-dirs: src
default-language: Haskell2010
我知道这目前有效,但我宁愿从一开始就以正确的方式使用它。这是 "right" 方式吗?
这是因为您的库版本是 0.1.0.0
,而不是 0.1
。它们不完全匹配,因此 cabal 不会将您的图书馆识别为候选者。相反,根据您的版本策略使用 0.1.*
或 0.1.0.0
:
executable UTFTConverter
main-is: Main.hs
build-depends: base >=4.7 && <4.8
, filepath >=1.3 && <1.4
, directory >=1.2 && <1.3
, time >=1.4 && <1.5
, bytestring >=0.10 && <0.11
, JuicyPixels >=3.2 && <3.3
, UTFTConverter ==0.1.0.0
hs-source-dirs: src
参考资料
- Cabal User Guide,部分 "Build Information"。