Вчера не по своей воле дебажил веб апликуху на laravel, в 500ку сопливило. Нашел что не существует путь, куда оно хочет записать сессию, кэш и т.п. шляпу. Типа такого app/data/storage/data. Path not found. Плюсом там еще вывалило кучу вложенных папок которых не существует для нормальной работы. Ок, уже есть с чем работать.



В идеальном мире обычно разработчики сами чекают такие директории и автоматически их создают, но это в идеальном мире. На деле все иначе. Время допиливать нет, поэтому скинем эту задачу на девопсов, пусть закостылят какой-нибудь скрипт.



А как создать структуру папок из скрипта? Можно и так:



mkdir /var/www/app/storage

mkdir /var/www/app/storage/data

mkdir /var/www/app/storage/data/public

mkdir /var/www/app/storage/data/view

mkdir /var/www/app/storage/data/view/public/html

mkdir /var/www/app/storage/data/meta

mkdir /var/www/app/storage/data/meta/bundle




Вполне читаемо. Но если ты не знаешь, у mkdir есть аргумент, который создаст полностью структуру несуществующих папок. А если оно существует, то лишний раз орать не станет.



Работает это так:



mkdir -p /var/www/app/storage/{data/public,data/view,data/public/html,data/meta/bundle}




-p, --parents = no error if existing, make parent directories as needed



Заметь что я отдельно не создаю папку meta и view/public, они создаются в момент создания конченных папок bundle и html.



Если посмотреть strace, то видим с какими параметрами запустился mkdir



execve("/usr/bin/mkdir", ["mkdir", "-p", "/var/www/app/storage/data/public", "/var/www/app/storage/data/view", "/var/www/app/storage/public/html", "/var/www/app/storage/data/meta/b"...




А можно вынести все пути в отдельный файл, а потом через цикл прогнать. Но я бы не стал по файлам раскидывать, сделал бы какой-нибудь массив путей и передал на съедение mkdir.



Как я и сказал выше, в данном контексте задачи - это костыль. Но если вернуть эту задачу на разработчиков, 100% вернется техдир и скажет - уважаемый, не делай мне нервы, СОЗДАЙ НУЖНЫЕ ПАПКИ САМ!!! Это проблема на сервере, а не в коде. В этом споре победителей не будет.



Если команда хочет костылей, она их получает. Но я все же придерживаюсь поговорки - Нормально делай, нормально будет. Хотя по большей части это справедливо лишь для моих личных проектов, где я всегда найду время и на юнит-тесты и на рефакторинг.



Хорошего вторника и увидимся вечерком.



tags: #linux #bash #рабочиебудни



💩 @bashdays