uuid: - value: 10105b0a-c18f-4b77-8ac9-bec3250e37b7 langcode: - value: en type: - target_id: daily_email target_type: node_type target_uuid: 8bde1f2f-eef9-4f2d-ae9c-96921f8193d7 revision_timestamp: - value: '2025-05-11T09:00:44+00:00' revision_uid: - target_type: user target_uuid: b8966985-d4b2-42a7-a319-2e94ccfbb849 revision_log: { } status: - value: true uid: - target_type: user target_uuid: b8966985-d4b2-42a7-a319-2e94ccfbb849 title: - value: | just vs make created: - value: '2023-04-11T00:00:00+00:00' changed: - value: '2025-05-11T09:00:44+00:00' promote: - value: false sticky: - value: false default_langcode: - value: true revision_translation_affected: - value: true path: - alias: /daily/2023/04/11/just-vs-make langcode: en body: - value: |
just
compared to make
is something that was asked during my PHP London talk, and whilst they are similar, just
has differences for me that explains why I use it:
A Makefile needs to use tabs. Justfiles are more flexible and work with tabs or any number of spaces.
With a Makefile, you need to declare some targets as "phony". I believe that this is for targets that don't generate artifact files with that name, so as I'm not compiling and building files with make
, this is redundant and adds visual noise.
This is how a composer
target looks like in a Makefile:
composer:
docker compose exec php composer
With this, I'd expect to be able to pass arguments to it - e.g. make composer info drupal/core
.
But, instead of seeing the expected output, I get an error: make: *** No rule to make target 'info'. Stop.
.
This is what I'd need to do to pass arguments to the composer
target:
composer:
docker compose exec php composer $(COMPOSER_ARGS)
Now I can run make composer COMPOSER_ARGS="info drupal/core"
and see what I was expecting but the syntax isn't what I'd want.
just
, on the other hand, allows for defining parameters to its recipes:
composer *args:
docker compose exec php composer
Here, I can create as many named parameters as needed and use them in the recipe with the syntax that I wanted - just composer info drupal/core
.
I can think of a few others but this is is the main reason why I moved from make
and later adopted just
.
just
, for me, gives the flexibilty that I need whilst using a simple and familiar syntax but without some of the confusing and complicated behaviours of make
.
just
compared to make
is something that was asked during my PHP London talk, and whilst they are similar, just
has differences for me that explains why I use it:
A Makefile needs to use tabs. Justfiles are more flexible and work with tabs or any number of spaces.
With a Makefile, you need to declare some targets as "phony". I believe that this is for targets that don't generate artifact files with that name, so as I'm not compiling and building files with make
, this is redundant and adds visual noise.
This is how a composer
target looks like in a Makefile:
composer:
docker compose exec php composer
With this, I'd expect to be able to pass arguments to it - e.g. make composer info drupal/core
.
But, instead of seeing the expected output, I get an error: make: *** No rule to make target 'info'. Stop.
.
This is what I'd need to do to pass arguments to the composer
target:
composer:
docker compose exec php composer $(COMPOSER_ARGS)
Now I can run make composer COMPOSER_ARGS="info drupal/core"
and see what I was expecting but the syntax isn't what I'd want.
just
, on the other hand, allows for defining parameters to its recipes:
composer *args:
docker compose exec php composer
Here, I can create as many named parameters as needed and use them in the recipe with the syntax that I wanted - just composer info drupal/core
.
I can think of a few others but this is is the main reason why I moved from make
and later adopted just
.
just
, for me, gives the flexibilty that I need whilst using a simple and familiar syntax but without some of the confusing and complicated behaviours of make
.