不同的服务器和客户端依赖性与匆忙

Different server and client dependencies with haste

我正在构建一个我想使用 Elasticsearch 的小型加速项目。然而,bloodhound which seems like the library to go for for elasticsearch in haskell depends indirectly on 。现在,我不需要从客户端调用 elastic,所以我不需要 需要 bloodhound,但我需要能够从与以下代码相同的代码库中调用它haste 旨在为服务器端和客户端使用相同的代码。我想我可以以某种方式拥有单独的客户端和服务器端实现,但我真的很喜欢这种快速的方式。

如何快速调用仅存在于服务器端的依赖项?

Preprocessor 可用于此目的。 Haste 定义了 __HASTE__ 宏,所以它应该足以将您的代码包装在条件语句中:

{-# LANGUAGE CPP #-}

main = do
#ifdef __HASTE__
    print "haste!"
#endif

#ifndef __HASTE__
    print "not haste!"
#endif

    print "everybody"

不要忘记使用 {-# LANGUAGE CPP #-} pragma 启用 C 预处理器扩展。

您也可以在“.cabal”文件中实现类似的效果:

Build-Depends:
    bytestring >= 0.9.2.1
if flag(haste-inst)
    Build-Depends:
        base == 4.6.0.1,
        array == 0.4.0.1
else
    Build-Depends:
        base,
        array,
        random,
        websockets >= 0.8

(来源https://github.com/valderman/haste-compiler/blob/0.4/libraries/haste-lib/haste-lib.cabal#L63

请注意,haste-inst 标志在 Haste 的最新开发版本中已重命名为 haste-cabal

我考虑过的一个潜在解决方案是导入一个 "Shared" 模块,用于不同的实现,一个 client/Shared.hs 和一个 server/Shared.hs,然后包含一个使用-i 选项。所以 -iclient 用于加速,-iserver 用于 ghc。

不过我目前无法对此进行测试,所以我将不得不返回。