From 38e14074a2f2874132361d5439ac78b328c8aa93 Mon Sep 17 00:00:00 2001 From: Oliver Davies Date: Sat, 25 Jan 2025 23:01:37 +0000 Subject: [PATCH] Add daily email for 2025-01-19 Minimum viable development environment --- source/_daily_emails/2025-01-19.md | 73 ++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 source/_daily_emails/2025-01-19.md diff --git a/source/_daily_emails/2025-01-19.md b/source/_daily_emails/2025-01-19.md new file mode 100644 index 00000000..dc7982e1 --- /dev/null +++ b/source/_daily_emails/2025-01-19.md @@ -0,0 +1,73 @@ +--- +title: Minimum viable development environment +date: 2025-01-19 +permalink: daily/2025/01/19/minimum-viable-development-environment +tags: + - software-development + - linux + - nix + - php + - drupal +cta: ~ +snippet: | + I've been searching for the leanest and most minimal development environment, and I think I've found it. +--- + +What is the leanest and most minimal local environment for software development? + +I think if you use Linux, the most minimal approach is to install the packages you need, such as PHP and MySQL directly in your operating system. + +There's no overhead or complexity added by tools like containers so things will run as quick and efficiently as possible. + +This is great if you only work on one project and you can easily keep your installation in sync with production. + +But what if you work on multiple projects or with a team of Developers? + +You need a way for everyone to have the same software and package versions, and to be able to configure them for each project. + +These are the reasons why tools like Vagrant, Docker and Podman became popular, as they made it possible for environments to be easily repeatable and customisable. + +## What about Nix? + +Another tool that can be used to install software is Nix - a package manager with over 100,000 software packages. + +I can use it to install the required software for each project and share the files with any team members so they have the same configuration. + +This is the `flake.nix` file that I've been testing with a Drupal codebase: + +```nix +{ + inputs.nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + + outputs = + { nixpkgs, ... }: + let + system = "x86_64-linux"; + pkgs = nixpkgs.legacyPackages.${system}; + in + { + devShells.${system}.default = pkgs.mkShell { + buildInputs = with pkgs; [ + mariadb + php82 + php82Packages.composer + ]; + }; + }; +} +``` + +This installs PHP 8.2, Composer and MariaDB, and nothing else. + +It also generates a `flake.lock` file so everyone gets exactly the same package versions. + +The downside is that, if everyone isn't using NixOS which handles services, I need to configure the database server for each project, running commands like `mysql_install_db` and `mysqld` before creating the database and user to put in the `settings.php` file. + +It's not complicated but [devenv is a great option][0] if you want something more fully featured and opinionated that does more out of the box. + +Once the database server is running and Drupal is installed, I can run `drush runserver` to run the website - no need for Apache, Caddy or Nginx. + +If you want to see another example, see the [flake.nix file for this website][1]. + +[0]: {{site.url}}/daily/2024/11/11/could-nix-and-devenv-replace-docker-compose +[1]: https://code.oliverdavies.uk/opdavies/oliverdavies.uk/src/commit/4350852406e9556b63a1df448f225abbd7883651/flake.nix