A tiny, Haskell-specific wrapper for the nix-shell
script interpreter. Extracts package dependencies specified with -XPackageImports
and constructs a nix-shell
command.
Put the script on your $PATH
:
$ curl https://raw.githubusercontent.com/jmackie/nix-runghc/master/nix-runghc > SOME_PATH_DIRECTORY/nix-runghc
Main.hs
#! /usr/bin/env nix-runghc
#! ghc=842
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PackageImports #-}
module Main where
import "aeson" Data.Aeson ((.:))
import qualified "aeson" Data.Aeson as Aeson
import qualified "bytestring" Data.ByteString.Lazy.Char8 as ByteString
import qualified "HTTP" Network.HTTP as HTTP
import qualified System.IO as IO
-- Some actual code here...
Provided nix-runghc
is available on your path and the module (above) is executable, you can run it with:
$ ./Main.hs
Which will end up invoking:
$ nix-shell \
--packages "haskell.packages.ghc842.ghcWithPackages (pkgs: with pkgs; [aeson bytestring HTTP])" \
--pure \
--command "sed '/^!#/d' ./Main.hs | runghc --ghc-arg=-XPackageImports; exit"
I feel lost without ghcid
these days. So I added the ability to drop into a configured nix-shell
, from which you can fire up ghcid
or your editor
or whatever.
$ nix-runghc --shell ./Main.hs
$ nix-runghc -v --shell ./Main.hs # verbose output
$ nix-runghc --shell --hoogle ./Main.hs # with docs