是否可以将长#! 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(和其他)包依赖项进行特殊处理,允许它们分成多行,但它的名字不包括我和我无法找到它。也许有些人还记得吗?
我可以尝试其他任何想法吗?
答案 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;跨线。 (我想如果你觉得它可以以不破坏的方式添加......)