有可能打破长#! nix-shell -p`行多行?

时间:2018-02-01 20:30:02

标签: shell haskell nix nix-shell

是否可以将长#! 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(和其他)包依赖项进行特殊处理,允许它们分成多行,但它的名字不包括我和我无法找到它。也许有些人还记得吗?

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

1 个答案:

答案 0 :(得分:2)

nix-shell -p重复使用Nixpkgs&#39; 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-shell shebang解析器当前不支持&#34; shell单词&#34;跨线。 (我想如果你觉得它可以以不破坏的方式添加......)