For Laravel development, we often find ourselves typing commands like ./vendor/bin/pest
to run project-specific commands.
We don't need to!
To help here, we can update our Mac (or Linux) $PATH
variable.
$PATH
?
What's The $PATH
variable sets the directories your system looks for when finding commands to run.
For example, we can type which <cmd>
to find the path to any given command:
$ which git/usr/local/bin/git
My system knew to find git
in /usr/local/bin
because /usr/local/bin
is one directory set in my $PATH
!
You can echo
out your path right now:
# Output the whole pathecho $PATH # For human-readability, split out each# directory into a new line:echo "$PATH" | tr ':' '\n'
Relative Directories in PATH
We can edit our $PATH
variable to add in whatever directories we want!
One extremely handy trick is to set relative directories in your $PATH
variable.
Two examples are adding ./vendor/bin
and ./node_modules/.bin
:
# In your ~/.zshrc, ~/.bashrc or, ~/.bash_profile or similar# Each directory is separated by a colonPATH=./vendor/bin:./node_modules/.bin:$PATH
Here we prepended our two new paths to the existing $PATH
variable. Now, no matter what Laravel application we're cd
ed into, we can run pest
and know we're running ./vendor/bin/pest
, phpunit
to run ./vendor/bin/phpunit
(and the same for any given Node command in ./node_modules/.bin
).
We can also set the current directory .
in our $PATH
(if it's not already set - it may be):
# In your ~/.zshrc, ~/.bashrc or, ~/.bash_profile or similar# Each directory is separated by a colon# Here we also set the current directory in our PATHPATH=.:./vendor/bin:./node_modules/.bin:$PATH
This way we can type artisan
instead of ./artisan
or php artisan
.
These are the settings I have in place in Chipper CI so users can run pest
or phpunit
without having to worry about where the command exists in their CI environments.
Notes
Order also matters in $PATH
. When a command is being searched for, the earlier directories are searched first. The system will use the first command found - this means you can over-ride a system command by placing it in a directory earlier in $PATH
. That's why we prepend ./vendor/bin
and ./node_modules/.bin
into $PATH
instead of append it.
You can find all locations of a command like this:
$ which -a git git is /usr/local/bin/gitgit is /usr/bin/gitgit is /usr/local/bin/gitgit is /usr/bin/git
Lastly, in all cases here, the commands should have executable permissions to work like this. This is something to keep in mind when creating your own commands, such as a custom bash script.
Teaching coding and servers at CloudCasts and Servers for Hackers. Co-founder of Chipper CI.