用 Hpack 清理我们的项目

用 Hpack 清理我们的项目

原文:https://medium.com/hackernoon/cleaning-up-our-projects-with-hpack-9253dabcb8e2

大约一个月前,我们发布了免费的堆栈迷你课程。如果你以前从未使用过 Stack,你完全应该去看看那个课程!这篇文章将让你先睹为快,了解课程中的一些内容。

但是,如果您已经熟悉堆栈的基础知识,并且认为您不需要该课程,请不要担心!在本文中,我们将通过另一个很酷的工具来简化您的工作流程!

几乎所有你创建的 Haskell 项目都会用到 Cabal。Cabal 为你执行了几项重要的任务。它为您下载依赖项,并在文件系统中定位您编写的代码。它还链接你所有的代码,这样 GHC 就可以编译它。为了让 Cabal 做到这一点,你需要创建一个描述所有这些事情的.cabal文件。例如,它需要知道你的代码的每一部分依赖于什么库。您还必须指定源文件目录在文件系统中的位置。

一个.cabal文件的组织有时有点混乱。语法可能相当冗长。如果我们使用“Hpack”工具,我们可以使我们的生活更简单。Hpack 允许您以更简洁的格式指定您的项目组织。一旦指定了 Hpack 格式的所有内容,就可以用一个命令生成.cabal文件。

使用 Hpack

使用 hpack 的第一步当然是下载它。这很简单,只要你在你的系统上安装了 Stack。使用命令:

stack install hpack

这将在系统范围内安装 Hpack,这样您就可以在所有项目中使用它。下一步是在一个名为package.yaml的文件中指定代码的组织。这里有一个简单的例子:

name: HpackExampleProjectversion: 0.1.0.0ghc-options: -Walldependencies:
  - baselibrary:
  source-dirs: src/executables:
  HpackExampleProject-exe:
    main: Main.hs
    source-dirs: app/
    dependencies:
      HpackExampleProjecttests:
  HpackExampleProject-test:
    main: Spec.hs
    source-dirs: test/ 
    dependencies:
      HpackExampleProject

这个例子将生成一个非常简单的 cabal 文件。它看起来很像运行stack new HpackExampleProject的默认模板。有几个基本的字段,比如我们项目的名称、版本和编译器选项。我们可以指定关于我们的代码库、可执行文件和任何测试套件的细节,就像我们可以在一个.cabal文件中一样。这些组件中的每一个都可以有自己的依赖关系。我们还可以指定全局依赖关系。

一旦我们创建了这个文件,我们需要做的就是从包含这个文件的目录中运行hpack命令。这将生成我们的.cabal文件:

>> hpack
generated HpackExampleProject.cabal

Hpack 解决了哪些问题?

hpack 解决的一个大问题是模块推理。您的.cabal文件应该指定作为您的库的一部分的所有 Haskell 模块。您总是有两个组:“公开的”模块和“其他”模块。列出这些模块中的每一个都是很烦人的,随着你的库变得越来越大,这个列表会变得很长!更糟糕的是,当您创建了一个新模块,但忘记将它添加到。阴谋文件。使用 Hpack,您不需要记住添加大多数新文件!它会查看您的文件系统,并确定为您提供了哪些模块。假设您已经在源目录中这样组织了文件:

src/Lib.hs
src/API.hs
src/Internal/Helper.hs
src/Internal/Types.hs

使用正常的。cabal方法,您需要手动列出这些模块。但是没有在 package.yaml 文件中列出任何内容,您将在。cabal 文件:

exposed-modules:
  API
  Internal.Helper
  Internal.Types
  Lib

现在,您可能不希望所有的模块都公开。您可以对程序包文件进行简单的修改:

library:
  source-dirs: src/
  exposed-modules:
    - API
    - Lib

并且 hpack 将纠正.cabal文件。

exposed-modules:
  API
  Lib
other-modules:
  Internal.Helper
  Internal.Types

从这一点来看,Hpack 会将所有新的 Haskell 模块推断为“其他”模块。您只需要在 package.yaml 中列出“暴露的”模块。只需要记住一件事!你需要在每次添加新模块时运行hpack,否则 Cabal 不知道你的代码在哪里。这仍然比每次修改.cabal文件容易得多。.cabal文件本身仍然包含一长串模块名。但是它们中的大部分不会出现在package.yaml文件中,这是你主要的交互点。

使用 hpack 的另一个好处是全局依赖性。请注意,在示例中,我们在所有其他部分的上方有一个“dependencies”字段。这意味着我们的库、可执行文件和测试套件都将免费获得 base 作为依赖项。如果没有 hpack,我们将需要在每个单独的部分中指定 base 作为依赖项。

hpack 还提供了大量其他语法。一个简单的例子是 github 规范。您可以将以下单行放入您的程序包文件中:

github: username/reponame

您将在您的.cabal文件中免费获得以下代码行。

homepage:          https://github.com/username/reponame#readme
bug-reports:       [https://github.com/username/reponame/issues](https://github.com/username/reponame/issues)

摘要

一旦你超越了玩具项目,你的包的维护将不是微不足道的。如果你使用 hpack,你将更容易组织你的第一个大项目。语法更清晰。组织更直观。最后,你将为自己省去执行许多重复任务的压力。对.cabal文件的不断编辑将会中断您的流程和构建过程。所以避免它们会让你更有效率。

如果你以前从未使用过 Stack 或 Cabal,这里有很多东西需要掌握。但是希望你相信有简单的方法来组织你的 Haskell 代码!如果您对如何学习感兴趣,请注册参加我们免费的 Stack 迷你课程!您将了解到组织 Haskell 项目的所有简单方法。

如果您从来没有使用过 Haskell,并且对这一切感到完全困惑,没有必要烦恼!下载我们的入门清单,你将踏上学习 Haskell 的征途!


本站为非盈利网站,作品由网友提供上传,如无意中有侵犯您的版权,请联系删除