是否可以将一个很长的#! 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 (和其他)包依赖关系,允许它们分解为多行,但我不记得它的名字,我也找不到它。也许你们中的一些人还记得?
还有其他的想法我可以尝试一下吗?
发布于 2018-02-02 16:54:52
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-shell shebang解析器目前不支持跨行的"shell word“。(如果你愿意的话,我想它可以以一种不间断的方式添加……)
https://stackoverflow.com/questions/48571228
复制相似问题