首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有可能分解一个长的`#!nix-shell -p`行分成多行吗?

有没有可能分解一个长的`#!nix-shell -p`行分成多行吗?
EN

Stack Overflow用户
提问于 2018-02-02 04:30:02
回答 1查看 448关注 0票数 2

是否可以将一个很长的#! nix-shell -p行分解为多行?

示例:

代码语言:javascript
复制
#!/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看不到镜头和文本包。

代码语言:javascript
复制
#!/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 (和其他)包依赖关系,允许它们分解为多行,但我不记得它的名字,我也找不到它。也许你们中的一些人还记得?

还有其他的想法我可以尝试一下吗?

EN

回答 1

Stack Overflow用户

发布于 2018-02-02 16:54:52

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

Haskell包需要一个特殊包装的GHC,这对于stdenv来说太具体了。您可以使用ghcWithPackages函数手动完成此操作:

代码语言:javascript
复制
#!/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“。(如果你愿意的话,我想它可以以一种不间断的方式添加……)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48571228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档