{ pkgs ? import { config = { allowUnfree = true; # Allow unfree packages like Consul (BSL 1.1) }; } }: let go = pkgs.go_1_24; in pkgs.mkShell { buildInputs = with pkgs; [ # Go compiler go # Protocol Buffers compiler protobuf # Go tools (available in nixpkgs) go-tools # Includes goimports, gopls, etc. golangci-lint # gRPC tools for testing grpcurl # Build tools gcc glibc # Version control git # Database tools (optional, for local development) postgresql # Service discovery (optional, for local development) consul # Docker tools (optional, for docker-compose) docker docker-compose ]; # Set up environment variables and install Go tools shellHook = '' # Set Go environment export GOPATH="$HOME/go" export GOBIN="$GOPATH/bin" export PATH="$PATH:$GOBIN" export PATH="$PATH:${go}/bin" # Install Go tools if not already installed if ! command -v protoc-gen-go > /dev/null 2>&1; then echo "Installing protoc-gen-go..." ${go}/bin/go install google.golang.org/protobuf/cmd/protoc-gen-go@latest fi if ! command -v protoc-gen-go-grpc > /dev/null 2>&1; then echo "Installing protoc-gen-go-grpc..." ${go}/bin/go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest fi # Verify tools are available echo "" echo "=== Development Environment Ready ===" echo "Go version: $(${go}/bin/go version)" echo "protoc version: $(protoc --version 2>/dev/null || echo 'not found')" echo "golangci-lint version: $(golangci-lint --version 2>/dev/null || echo 'not found')" echo "grpcurl version: $(grpcurl --version 2>/dev/null || echo 'not found')" echo "" echo "Go tools:" echo " protoc-gen-go: $(command -v protoc-gen-go > /dev/null 2>&1 && echo '✓ installed' || echo '✗ not found')" echo " protoc-gen-go-grpc: $(command -v protoc-gen-go-grpc > /dev/null 2>&1 && echo '✓ installed' || echo '✗ not found')" echo " goimports: $(command -v goimports > /dev/null 2>&1 && echo '✓ installed' || echo '✗ not found')" echo "======================================" echo "" ''; }