I Prefer Makefiles over Package.json Scripts

This page summarizes the projects mentioned and recommended in the original post on news.ycombinator.com

SurveyJS - Open-Source JSON Form Builder to Create Dynamic Forms Right in Your App
With SurveyJS form UI libraries, you can build and style forms in a fully-integrated drag & drop form builder, render them in your JS app, and store form submission data in any backend, inc. PHP, ASP.NET Core, and Node.js.
surveyjs.io
featured
InfluxDB - Power Real-Time Data Analytics at Scale
Get real-time insights from all types of time series data with InfluxDB. Ingest, query, and analyze billions of data points in real-time with unbounded cardinality.
www.influxdata.com
featured
  • yplatform

    Self-service bootstrap/build/CI/CD. Software and configuration that supports various cycles of software development.

  • https://github.com/ysoftwareab/yplatform that this a notch higher (disclaimer: author here)

    As others have mentioned on this thread, the problem is not just "use Makefiles instead of package.json scripts", but quickly ending up with duplicate Makefile content and then supporting more than just one language. It's inevitable.

    PS

    for those that don’t know, npm’s “scripts” functionality as we know it today was not “designed”, but it was simply a byproduct.

    First introduced as an internal functionality for lifecycle support https://github.com/npm/npm/commit/c8e17cef720875c1f7cea1b49b... on 1 Mar 2010

    and later extend to run arbitrary targets https://github.com/npm/npm/commit/9b8c0cf87a9d4ef560e17e060f... on 13 Dec 2010

    This is the entire design backstory https://github.com/npm/npm/issues/298 .

    Needless to say that GNU Make’s equivalent (or any other build system) is not to be found in npm’s scripts.

  • magicfile

    Simple Makefile template for documenting frequent commands.

  • https://github.com/awinecki/magicfile

    People call this "self-documenting makefile".

    It migrated with me from company to company, from project to projects. Through node, php, aws, docker, server management, cert updates, file processing and many many more.

  • SurveyJS

    Open-Source JSON Form Builder to Create Dynamic Forms Right in Your App. With SurveyJS form UI libraries, you can build and style forms in a fully-integrated drag & drop form builder, render them in your JS app, and store form submission data in any backend, inc. PHP, ASP.NET Core, and Node.js.

    SurveyJS logo
  • quickjs-emscripten

    Safely execute untrusted Javascript in your Javascript, and execute synchronous code that uses async functions

  • I like Make, and use it in personal JavaScript ecosystem projects that do actually need to build things with interdependency (eg https://github.com/justjake/quickjs-emscripten/blob/master/M...). I’ve also seen Makefiles grown to be horrendous monstrosities masquerading as command-line tools; for about a year at Airbnb we used a 1000 line Makefile as the main tool for fiddling with Kubernetes cuz one of our senior engineers didn’t like Ruby.

    What I learned from supporting Make and shell among a few different audiences is that most developers have no idea how to write or maintain shell-like tooling. They forget or mess up quoting rules constantly, and eschew learning things and good design in these tools to a much greater degree than in their “normal” work in Java/Python/Ruby/Typescript/Golang.

    For every POSIXly Correct HN Commenter (of which I count myself a member), there’s 100 regular software engineers who won’t read a `man` page on what $@ or $< mean in Make. I know that if I start writing a Makefile for $JOB, it’s gonna be me and that one guy who uses tcsh who are gonna maintain it and answer questions.

    (Although for what it’s worth we don’t use package.json either thank goodness. All our complicated build steps are typescript commands, and our glue is CI system YAML files.)

  • tup

    Tup is a file-based build system.

  • For a lot of the same reasons in this article I like to use tup[0] when I can. It doesn't integrate into anything which is both good and bad. I wish my IDE could check with tup to see what dependencies get pulled in by what files. However, it's nice that it doesn't care what language or ecosystem I'm using.

    Also I can get a neat dependency graph as a PNG if I want.

    [0] https://gittup.org/tup/

  • SheetJS js-xlsx

    📗 SheetJS Spreadsheet Data Toolkit -- New home https://git.sheetjs.com/SheetJS/sheetjs

  • Make is an incredible swiss army knife, and we use it for most JS projects (e.g. https://github.com/SheetJS/sheetjs/blob/master/Makefile)

    The main reasons to prefer package.json scripts are portability (works on windows without figuring out WSL) and binary paths. Years ago it was popular to install command-line tools globally, but now the trend is to favor local installations and run with `npx`. `package.json` scripts will do the "right thing", but `eslint` in a makefile will look for a system-wide `eslint` installation.

  • just

    🤖 Just a command runner

  • I would like to call attention to `just` (https://github.com/casey/just) which is a modern take on "make if we didn't have to keep it backwards compatible", and more focussed on just task running rather than tracking dependencies.

  • Task

    A task runner / simpler Make alternative written in Go

  • InfluxDB

    Power Real-Time Data Analytics at Scale. Get real-time insights from all types of time series data with InfluxDB. Ingest, query, and analyze billions of data points in real-time with unbounded cardinality.

    InfluxDB logo
  • Taskfile

    Repository for the Taskfile template.

  • I was amazed to discover Taskfile. Didn't realise it was a copy of Make.

    https://github.com/adriancooney/Taskfile

  • rimraf

    A `rm -rf` util for nodejs

  • No, that's why there's a bunch of packages such as rimraf[0] that implements that sort of functionality in a cross-platform way that most people use in their scripts

    [0]: https://www.npmjs.com/package/rimraf

  • avr-hal

    embedded-hal abstractions for AVR microcontrollers

  • > - Compile this Rust app with Cargo then flash it to the esp32? Make.

    Why not something like this?

    > cargo run --bin uno-blink

    https://github.com/Rahix/avr-hal

  • sdi

  • We are using make targets to automate ci/cd, local dev and a lot of other things by adding a set of easy to extend, customise template makefiles as submodules.

    The main advantage for us is it's same everywhere and it's agnostic to underlying technologies. (we are only supporting unix based environments and have guidelines to setup gnumake in macos)

    We are also using make targets to document themselves. How to use, what are other targets, variables you need to define etc. This makes it a powerful CLI app for us that can run and support many things.

    For anyone interested: https://gitlab.com/ska-telescope/sdi/ska-cicd-makefile

  • gnumake-windows

    Instructions for building gnumake.exe as a native windows application

  • I've been using GNU Make 4.2.1 from here: https://github.com/mbuilov/gnumake-windows - depends only on kernel32.dll. I assume the latest 4.3 build there is the same.

  • turborepo

    Discontinued Incremental bundler and build system optimized for JavaScript and TypeScript, written in Rust – including Turborepo and Turbopack. [Moved to: https://github.com/vercel/turbo]

  • Why I prefer package.json over makefiles:

    - turborepo (https://turborepo.org/) can describe dependency pipelines and provide automatic caching. Makefiles aren't designed for multi-input, multi-output scenarios - its really awkward: https://www.gnu.org/software/automake/manual/html_node/Multi... and https://stackoverflow.com/questions/39237306/makefile-compil...

    - turborepo can also run never-ending targets in parallel (e.g. API server and static file server in development mode). Not sure how well make supports that

  • npm

  • https://github.com/ysoftwareab/yplatform that this a notch higher (disclaimer: author here)

    As others have mentioned on this thread, the problem is not just "use Makefiles instead of package.json scripts", but quickly ending up with duplicate Makefile content and then supporting more than just one language. It's inevitable.

    PS

    for those that don’t know, npm’s “scripts” functionality as we know it today was not “designed”, but it was simply a byproduct.

    First introduced as an internal functionality for lifecycle support https://github.com/npm/npm/commit/c8e17cef720875c1f7cea1b49b... on 1 Mar 2010

    and later extend to run arbitrary targets https://github.com/npm/npm/commit/9b8c0cf87a9d4ef560e17e060f... on 13 Dec 2010

    This is the entire design backstory https://github.com/npm/npm/issues/298 .

    Needless to say that GNU Make’s equivalent (or any other build system) is not to be found in npm’s scripts.

  • cod-stats

    All-inclusive ETL pipeline to pull Modern Warfare statistics and generate statistical reporting for a playgroup

  • The Makefile is the facade to the project. So you can have `make run` do `make run-windows` or `make run-nix` under the hood. And when you change hosts, or you redo the `run-X` targets into a single cross-platform binary or you put it in a Docker container, nothing changes. You don't need to remember that you need to invoke X or Y script.

    I'm pretty sure git-bash provides `Make` on Windows. I believe thats how I tested it for this project: https://github.com/J-Swift/cod-stats

  • SaaSHub

    SaaSHub - Software Alternatives and Reviews. SaaSHub helps you find the best software and product alternatives

    SaaSHub logo
NOTE: The number of mentions on this list indicates mentions on common posts plus user suggested alternatives. Hence, a higher number means a more popular project.

Suggest a related project

Related posts

  • Getting started with TiniJS framework

    7 projects | dev.to | 20 Apr 2024
  • Supermemory - ChatGPT for your bookmarks

    2 projects | dev.to | 14 Apr 2024
  • Next.js Shopify eCommerce Starter with Perfect Web Vitals 🚀

    2 projects | dev.to | 12 Apr 2024
  • Zx 8.0

    1 project | news.ycombinator.com | 7 Apr 2024
  • Show HN: Phoenix – Shell Implemented in JavaScript

    1 project | news.ycombinator.com | 26 Mar 2024