简体   繁体   English

如何避免在这个 cabal 文件中重新编译?

[英]How to avoid recompiling in this cabal file?

I've been working on this Haskell project, and I have a cabal file for it.我一直在研究这个 Haskell 项目,我有一个 cabal 文件。 Now, my project is structured as a library that implements a simple interpreter.现在,我的项目结构为一个实现简单解释器的库。 I also have a very short Main file which needs to be build into an executable to call the library.我还有一个非常短的主文件,需要将其构建到可执行文件中才能调用库。 What I want to do is:我想做的是:

1) compile the library and expose some of the modules 1)编译库并暴露一些模块

2) compile the executable 2)编译可执行文件

I have a cabal file that works and seems to do this.我有一个有效的 cabal 文件,并且似乎可以做到这一点。 The problem is that when it compiles the executable it recompiles all the modules which have already been compiled in step (1) .问题在于,当它编译可执行文件时,它会重新编译在步骤 (1) 中已经编译的所有模块 I don't quite understand why it does this - is there any way to stop it, short of creating two separate cabal files?我不太明白为什么会这样 - 除了创建两个单独的 cabal 文件之外,有什么方法可以阻止它?

I don't really want to create two separate cabal files, because cabal doesn't seem to like having both the cabal files in the same directory, and I don't really want to set up a separate project directory for the second step, since it basically just amounts to compiling a single file.我真的不想创建两个单独的 cabal 文件,因为 cabal 似乎不喜欢将两个 cabal 文件放在同一个目录中,而且我真的不想为第二步设置单独的项目目录,因为它基本上只是编译一个文件。

cabal-version:      >= 1.6
build-type:         Simple
name:               HaSC
version:            0.2.3
license:            OtherLicense
category:           Language
author:             Chris B
maintainer:         Chris B
copyright:          Chris B 2010 - 2011
synopsis:           (HA)skell (S)ound (C)hange applier (HaSC) library
description:        HaSC implements a little language for applying sound changes to words
homepage:           http://www.chrisdb.me.uk/redmine/projects/haskell-sound-change
stability:          Alpha
data-files:         doc/HaSCDoc.pdf
license-file:       LICENSE

library
    build-depends:
        base >= 4.3,
        containers >= 0.3,
        parsec >= 3,
        parallel >= 3.1,
        deepseq >= 1.1,
        mtl >= 1.1, 
        transformers >= 0.2,
        text >= 0.10,
        text-icu >= 0.6.3,
        pretty >= 1,
        directory >= 1.1,
        filepath >= 1.2
    hs-source-dirs:  src
    exposed-modules: HaSC.IO.Disk,
                     HaSC.IO.Memory,
                     HaSC.Exec
    other-modules:   HaSC.AST,
                     HaSC.IO,
                     HaSC.IdentMap,
                     HaSC.Parse,
                     HaSC.Regex,
                     HaSC.Representation,                     
                     HaSC.Transformations,
                     HaSC.Search,
                     HaSC.State

executable HaSC
    GHC-Options: -rtsopts
    hs-source-dirs:  src
    main-is:         Main.hs    

In your executable section, add the library in Build-Depends so that the executable depends on the library.在您的可执行部分中,将库添加到Build-Depends中,以便可执行文件依赖于该库。

There's a small gotcha, though: You also have to move the Main.hs of the executable (and any other source files specific to the executable) to a different subdirectory and specify a different Hs-Source-Dirs so that it doesn't pick up the library modules by being in the same folder.但是有一个小问题:您还必须将可执行文件的Main.hs (以及特定于可执行文件的任何其他源文件)移动到不同的子目录并指定不同的Hs-Source-Dirs以便它不会选择通过位于同一文件夹中来建立库模块。

executable HaSC
    Build-Depends: HaSC
    Main-Is: Main.hs
    Hs-Source-Dirs: foo -- Directory you moved Main.hs to

For this to work, you will need to specify Cabal-Version >= 1.8 .为此,您需要指定Cabal-Version >= 1.8 See Cabal ticket #89 for the details.有关详细信息,请参阅Cabal 票 #89

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM