
Bonjour Habrousers!
Aujourd'hui, nous allons continuer notre série d'articles sur Nix et comment nous l'utilisons chez Typeable.
Le premier article d'une série couvrant les bases du langage Nix peut être lu ici .
Haskell , , Haskell . , .
CI — . . Nix , . Nix , , .
, , . , Haskell, Hello world.
Main.hs
:
module Main where main :: IO () main = putStrLn "Hello, World!"
Nix stack
( ). stack stack.yaml
, resolver
. — Hackage, Haskell, , (NB ): ).
stack.yaml
:
resolver: lts-17.11 packages: - hello-world
hello-world.cabal
:
cabal-version: 2.4 name: hello-world version: 1.0 synopsis: Hello World license: MIT license-file: LICENSE author: Nick executable hello-world main-is: Main.hs build-depends: base >= 4 && < 5 hs-source-dirs: src default-language: Haskell2010 ghc-options: -Wall -O2
Nix , . , , :
$ stack run hello-world Hello, World!
Come to the dar^Wnix side, we have cookies!
stack — Haskell, . Haskell Nix haskell.nix, IOHK. - . , , Nix.
Haskell.nix .cabal
- stack.yaml
derivation
Nix.
nix/stackyaml.nix
:
{ # haskell.nix GitHub Nixpkgs . haskellNix ? import (builtins.fetchTarball "https://github.com/input-output-hk/haskell.nix/archive/b0d03596f974131ab64d718b98e16f0be052d852.tar.gz") {} # Nixpkgs. 21.05 :) , nixpkgsSrc ? haskellNix.sources.nixpkgs-2009 , nixpkgsArgs ? haskellNix.nixpkgsArgs , pkgs ? import nixpkgsSrc nixpkgsArgs }: let # stack. Cabal cabalProject. project = pkgs.haskell-nix.stackProject { name = "hello-world"; # Derivation . # cleanGit , git-. src = pkgs.haskell-nix.haskellLib.cleanGit { name = "hello-world"; # src , stack.yaml. src = ../.; # keepGitDir .git . # , , . keepGitDir = true; }; # modules , . modules = [{ # doCheck - , . # , false # . doCheck = false; # Hello World -Werror. packages.hello-world.components.exes.hello-world.ghcOptions = [ "-Werror" ]; }]; }; # project -- , pkgs -- nixpkgs, . in { inherit project; inherit pkgs; }
, Nix. nix build
. , result
, .
$ nix build project.hello-world.components.exes $ ./result/bin/hello-world Hello, World!
! , . !
Dockerfile? Dockerfile?
2021 , Docker . Typeable . nixpkgs
dockerTools
. , , . nix/docker.nix
.
, . Nix - , , , . , , . CentOS.
sourceImage = dockerTools.pullImage { imageName = "centos"; imageDigest = "sha256:e4ca2ed0202e76be184e75fb26d14bf974193579039d5573fb2348664deef76e"; sha256 = "1j6nplfs6999qmbhjkaxwjgdij7yf31y991sna7x4cxzf77k74v3"; finalImageTag = "7"; finalImageName = "centos"; };
, - Docker. Nix, Docker Registry sourceImage
.
dockerTools buildImage
. , , :
makeDockerImage = name: revision: packages: entryPoint: dockerTools.buildImage { name = name; tag = revision; fromImage = sourceImage; contents = (with pkgs; [ bashInteractive coreutils htop strace vim ]) ++ packages; config.Cmd = entryPoint; };
makeDockerImage
: , ( Typeable git ), , , . CentOS (fromImage
), , .
, , .
hello-world = project.hello-world.components.exes.hello-world; helloImage = makeDockerImage "hello" (if imageTag == null then "undefined" else imageTag) [ hello-world ] [ "${hello-world}/bin/hello-world" ];
, project.hello-world...
. , makeDockerImage
, hello-world
. imageTag
, , "undefined" .
:
$ nix build --argstr imageTag 1.0 helloImage [4 built, 0.0 MiB DL] $ ls -l result lrwxrwxrwx 1 user users 69 May 11 13:12 result -> /nix/store/56qqhiwahyi46g6mf355fjr1g6mcab0b-docker-image-hello.tar.gz
result
, . , .
$ docker load < result 76241b8b0c76: Loading layer [==================================================>] 285.9MB/285.9MB Loaded image: hello:1.0 $ docker run hello:1.0 Hello, World!
, , Haskell. , haskell.nix - , : nixpkgs C/C++, Python, Node .
, Nix. Stay tuned!