2

是否可以将一条长线#! nix-shell -p分成多条线?

例子:

#!/usr/bin/env nix-shell
#! nix-shell -p "haskell.packages.ghc822.ghcWithPackages (p: with p; [lens text bytestring hspec brick async])"
#! nix-shell -i "runghc"

{-# language OverloadedStrings #-}

import            Data.Text
import            Control.Lens
import            Data.Monoid

main = print $ ("foo" :: Text, True) & _1 %~ (<> " bar")

我试过这样,但毫不奇怪,GHC 没有看到镜头和文本包。

#!/usr/bin/env nix-shell
#! nix-shell -p "haskell.packages.ghc822.text"
#! nix-shell -p "haskell.packages.ghc822.lens"
#! nix-shell -p "haskell.packages.ghc822.ghc"
#! nix-shell -i "runghc"

{-# language OverloadedStrings #-}

import            Data.Text
import            Control.Lens
import            Data.Monoid

main = print $ ("foo" :: Texts, True) & _1 %~ (<> " bar")

我依稀记得有人在 GitHub 上#!为 nix 编写了一个自定义解释器,它允许对 Haskell(和其他)包依赖项进行特殊处理,允许它们分解成多行,但它的名字让我难以理解,我找不到它。也许你们中的一些人还记得?

我可以尝试其他任何想法吗?

4

1 回答 1

3

nix-shell -p重用 Nixpkgs'stdenv将包组合成适当的环境变量。这适用于 shell 命令、一些库等,但不适用于 Haskell 包。

Haskell 包需要一个特殊包装的 GHC,这对于stdenv. 您可以使用以下ghcWithPackages功能手动完成:

#!/usr/bin/env nix-shell
#!nix-shell -p 'haskellPackages.ghcWithPackages(pkgs: with pkgs; [lens acme-missiles])'
#!nix-shell -i runhaskell

import Acme.Missiles
import Control.Lens

main =
  if Just (Just True) ^.. traverse . traverse == [True]
  then putStrLn "Crisis averted"
  else launchMissiles

所以要回答你的第一个问题,它不能以你喜欢的方式分解。所有 Haskell 依赖项都需要在单个-p/--packages选项中,并且nix-shellshebang 解析器当前不支持跨行的“shell 单词”。(我想如果您愿意,可以以非破坏性的方式添加它......)

于 2018-02-02T08:54:51.717 回答