• Nix FlakeでGleam v1.11.1の開発環境を構築する

    2025年6月15日

    Gleamは様々なパッケージマネージャに対応していますが、Nixにおいては対応しているもののnixpkgsのパッケージがやや古いです。 これはGleam固有の問題というよりnixpkgsのあるあるみたいなものなので、手元で簡単に対応できるワークアラウンドとして最新のGleamをビルドするFlakeを紹介します。

    なお、以下のFlakeはdevenvというモジュールを使用しています。 devenvはFlakeで開発環境を構築する際に非常に便利なモジュールとなっているので、Flakeやflake-partsを使っているなら使うのをオススメします。

    以下のFlakeでは開発環境としてGleamの他に実行するためのErlangパッケージを指定しています。 もしJavaScriptの開発環境が欲しかったらJavaScriptを参考にJavaScript Runtimeを適宜追加してください。

    {
      description = "An simple flake for create gleam develop environment.";
    
      inputs = {
        nixpkgs.url = "github:nixos/nixpkgs?ref=nixpkgs-unstable";
        flake-parts.url = "github:hercules-ci/flake-parts";
        systems.url = "github:nix-systems/default";
        devenv.url = "github:cachix/devenv";
        rust-overlay.url = "github:oxalica/rust-overlay";
      };
    
      outputs =
        inputs@{
          self,
          systems,
          nixpkgs,
          flake-parts,
          ...
        }:
        flake-parts.lib.mkFlake { inherit inputs; } {
          imports = [
            inputs.devenv.flakeModule
          ];
          systems = import inputs.systems;
    
          perSystem =
            {
              config,
              pkgs,
              system,
              ...
            }:
            let
              rustPlatform = pkgs.makeRustPlatform {
            cargo = pkgs.rust-bin.nightly.latest.default;
            rustc = pkgs.rust-bin.nightly.latest.default;
               };
    
          gleam = rustPlatform.buildRustPackage rec {
            pname = "gleam";
            # Gleamのバージョン
            version = "1.11.0";
            src = pkgs.fetchFromGitHub {
              owner = "gleam-lang";
              repo = "gleam";
              rev = "v${version}";
                  # Gleamソースコードのハッシュ
              hash = "sha256-oxzFAqPZ+ZHd/+GwofDg0gA4NIFYWi2v8fOjMn8ixSU=";
            };
    
            useFetchCargoVendor = true;
                # Gleamの依存ライブラリのハッシュ
            cargoHash = "sha256-9kk7w85imYIhywBuAgJS8wYAIEM3hXoHymGgMMmrgnI="; 
    
            auditable = false;
                doCheck = false;
          };
            in
            {
              _module.args.pkgs = import inputs.nixpkgs {
                  inherit system;
                  overlays = [
            inputs.rust-overlay.overlays.default
                  ];
                  config = { };
                };
    
              devenv.shells.default = {
                packages = [ pkgs.nil ];
    
                languages = {
                  gleam = {
                    enable = true;
            package = gleam;
                  };
                  erlang = {
                    enable = true;
                  };
                };
    
                enterShell = '''';
              };
    
              packages.default = gleam;
            };
        };
    }
    

    今後Gleamのoverlayを開発する予定ではありますが、一先ずこのワークアラウンドを公開する事でお茶を濁すことにします...


    ko-fi ☕GitHub Sponsors 🐙