<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.9.0">Jekyll</generator><link href="/feed.xml" rel="self" type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" /><updated>2021-07-26T07:46:46+00:00</updated><id>/feed.xml</id><title type="html">Записки с фронтов</title><subtitle>Заметки вокруг фронтенда</subtitle><entry><title type="html">Использование env файлов в React</title><link href="/react/env/2020/05/23/using-env-variables-react.html" rel="alternate" type="text/html" title="Использование env файлов в React" /><published>2020-05-23T21:00:00+00:00</published><updated>2020-05-23T21:00:00+00:00</updated><id>/react/env/2020/05/23/using-env-variables-react</id><content type="html" xml:base="/react/env/2020/05/23/using-env-variables-react.html">&lt;p&gt;Иногда в react-приложении требуется использовать переменные окружения, например это может быть API url, либо какой-то конфиг или какие-то API ключи.
Есть 2 способа задать переменные окружения:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;через командную строку (временное решение в текущей сессии).&lt;/li&gt;
  &lt;li&gt;через &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.env&lt;/code&gt; файлы.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;create-react-app-cra&quot;&gt;Create React App (CRA)&lt;/h2&gt;

&lt;p&gt;В случае использования CRA, ничего настраивать не требуется. Под капотом уже установлены необходимые пакеты и настроен webpack для обработки таких файлов.
Обязательным условием является только префикс &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;REACT_APP_&lt;/code&gt; для переменных окружения. Например, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;REACT_APP_API_KEY=secret-api-key&lt;/code&gt;. Другие имена переменных будут игнорироваться, чтобы избежать случайного раскрытия секретного ключа, который может иметь то же имя. (Исключение составляет только &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NODE_ENV&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Чтобы использовать переменную в коде, нужно обратиться к ней так:&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;process.env.REACT_APP_API_KEY
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Другой способ задания переменных через командную строку (Bash):&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;REACT_APP_NOT_SECRET_CODE=abcdef npm start
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;свой-webpack-конфиг&quot;&gt;Свой webpack конфиг&lt;/h2&gt;

&lt;p&gt;В этом случае нужно установить плагин &lt;a href=&quot;https://www.npmjs.com/package/dotenv-webpack&quot;&gt;dotenv-webpack&lt;/a&gt;. 
Затем добавить в конфиг:&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;// webpack.config.js
const Dotenv = require('dotenv-webpack');
 
module.exports = {
  ...
  plugins: [
    new Dotenv()
  ]
  ...
};
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Также следует добавить .env.local файлы в &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.gitignore&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# misc
.env.local
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;виды-env-файлов&quot;&gt;Виды .env файлов&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.env&lt;/code&gt;: По умолчанию.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.env.local&lt;/code&gt;: Локальные переопределения. Этот файл загружается во всех окружениях, кроме test.&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.env.development&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.env.test&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.env.production&lt;/code&gt;: Настройки для конкретной среды.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.env.development.local&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.env.test.local&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.env.production.local&lt;/code&gt;: Локальные переопределения настроек для конкретной среды.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Файлы слева имеют больший приоритет, чем файлы справа.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;npm start&lt;/code&gt;: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.env.development.local&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.env.development&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.env.local&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.env&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;npm run build&lt;/code&gt;: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.env.production.local&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.env.production&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.env.local&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.env&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;npm test&lt;/code&gt;: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.env.test.local&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.env.test&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.env&lt;/code&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.env.local&lt;/code&gt; не участвует).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;разное&quot;&gt;Разное&lt;/h3&gt;

&lt;p&gt;После добавления &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.env&lt;/code&gt; файлов при запущенном &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;webpack-dev-server&lt;/code&gt;, его следует перезапустить.&lt;/p&gt;

&lt;p&gt;Иногда встречается ошибка, когда значения переменной заключают в кавычки - так работать не будет.&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;// Wrong 
REACT_APP_KEY=&quot;TEST&quot;
// Right
REACT_APP_KEY=TEST
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Обычно &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.env&lt;/code&gt; файлы лежат в корне проекта.&lt;/p&gt;

&lt;p&gt;Чтобы загрузить &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.env&lt;/code&gt; файл, в зависимости от окружения, в параметрах плагина можно указать переменную окружения &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NODE_ENV&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;module.exports = env =&amp;gt; {
  plugins: [
    new Dotenv({
      path: `./.env.${env.NODE_ENV}`,
      safe: false
    }),
   ]
};
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;развертывание-переменных-окружения&quot;&gt;Развертывание переменных окружения&lt;/h4&gt;

&lt;p&gt;Развертывание переменных уже присутствующих в системе в &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.env&lt;/code&gt; файле, используя &lt;a href=&quot;https://github.com/motdotla/dotenv-expand&quot;&gt;dotenv-expand&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Например, чтобы получить переменную окружения &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;npm_package_version&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;REACT_APP_VERSION=$npm_package_version
# also works:
# REACT_APP_VERSION=${npm_package_version}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Или раскрыть переменные локально в текущем &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.env&lt;/code&gt; файле:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;DOMAIN=www.example.com
REACT_APP_FOO=$DOMAIN/foo
REACT_APP_BAR=$DOMAIN/bar
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</content><author><name></name></author><category term="react" /><category term="env" /><summary type="html">Иногда в react-приложении требуется использовать переменные окружения, например это может быть API url, либо какой-то конфиг или какие-то API ключи. Есть 2 способа задать переменные окружения: через командную строку (временное решение в текущей сессии). через .env файлы.</summary></entry><entry><title type="html">Как собрать свой npm-пакет из форка</title><link href="/npm/github/2020/04/17/create-own-npm-package.html" rel="alternate" type="text/html" title="Как собрать свой npm-пакет из форка" /><published>2020-04-17T21:00:00+00:00</published><updated>2020-04-17T21:00:00+00:00</updated><id>/npm/github/2020/04/17/create-own-npm-package</id><content type="html" xml:base="/npm/github/2020/04/17/create-own-npm-package.html">&lt;p&gt;В ходе разработки иногда может потребоваться внести в какую-нибудь библиотеку на гитхабе свой функционал,
который нужен только на конкретном проекте или же библиотека давно не поддерживается и pull-request’ы никак не принимают.
В таких случаях выходом из ситуации является создание своего форка библиотеки.&lt;/p&gt;

&lt;p&gt;Один из вариантов решения проблемы является публикация &lt;em&gt;dist&lt;/em&gt; сборки на гитхаб, но такой подход не всегда 
можно использовать из-за ограничений стендов сборки проекта.&lt;/p&gt;

&lt;p&gt;Пример записи в &lt;em&gt;package.json&lt;/em&gt;:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;s2&quot;&gt;&quot;redux-saga-router&quot;&lt;/span&gt;: &lt;span class=&quot;s2&quot;&gt;&quot;luistorres/redux-saga-router#dist&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Другой вариант заключается в создании npm-пакета со своим scope (@username). Обычно берут свой username на гитхабе, но по сути можно написать 
все что угодно. Для публикации в npm потребуется зарегистрировать там аккаунт.&lt;/p&gt;

&lt;p&gt;Далее нужно поменять имя пакета на &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@username/package-name&lt;/code&gt; и увеличить патч версию пакета в &lt;em&gt;package.json&lt;/em&gt;.
После этого переходим в консоль:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npm login
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Вводим свои учетные данные.&lt;/p&gt;

&lt;p&gt;Далее пишем команду для публикации:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npm publish
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Однако так как мы используем scope, нужно дописать флаг &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--access public&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npm publish &lt;span class=&quot;nt&quot;&gt;--access&lt;/span&gt; public
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;После окончания процедуры устанавливаем новый пакет в свой проект:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npm i @username/package-name
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;hr /&gt;
&lt;p&gt;&lt;br /&gt;
В моей практике понадобилось завернуть широко используемую в проекте библиотеку в форк. 
Для этого мне нужно было бы поменять все импорты на другое имя пакета. Чтобы этого избежать, в npm есть возможность установить пакет под другим именем (алиасом):&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npm i &amp;lt;alias_name&amp;gt;@npm:&amp;lt;original_package_name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Таким образом имя меняется только в &lt;em&gt;package.json&lt;/em&gt;. Например:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; &lt;span class=&quot;s2&quot;&gt;&quot;redux-form&quot;&lt;/span&gt;: &lt;span class=&quot;s2&quot;&gt;&quot;npm:@machinek56/redux-form@^8.3.1&quot;&lt;/span&gt;,
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</content><author><name></name></author><category term="npm" /><category term="github" /><summary type="html">В ходе разработки иногда может потребоваться внести в какую-нибудь библиотеку на гитхабе свой функционал, который нужен только на конкретном проекте или же библиотека давно не поддерживается и pull-request’ы никак не принимают. В таких случаях выходом из ситуации является создание своего форка библиотеки.</summary></entry><entry><title type="html">Автоматизация линтинга и форматирования. Как не отправить “плохой” код в репозиторий.</title><link href="/webpack/husky/lint-staged/2020/04/09/automatisation-frontend.html" rel="alternate" type="text/html" title="Автоматизация линтинга и форматирования. Как не отправить “плохой” код в репозиторий." /><published>2020-04-09T21:00:00+00:00</published><updated>2020-04-09T21:00:00+00:00</updated><id>/webpack/husky/lint-staged/2020/04/09/automatisation-frontend</id><content type="html" xml:base="/webpack/husky/lint-staged/2020/04/09/automatisation-frontend.html">&lt;p&gt;Как часто вы пишете команды для запуска линтинга, тестов, форматирования кода? &lt;br /&gt;
А как часто пушите лишние коммиты, содержащие исправления по code style проекта? &lt;br /&gt;
В команде разработчиков сложно зачастую договориться о правилах форматирования кода,
и на помощь нам приходит известный инструмент &lt;em&gt;Prettier&lt;/em&gt;, который делает за нас всю грязную работу,
а именно форматирует код согласно единому стилю по одной команде.&lt;/p&gt;

&lt;p&gt;В мире фронтенда появились инструменты, позволяющие автоматизировать такие вещи без ручного запуска команд при срабатывании &lt;a href=&quot;https://git-scm.com/docs/githooks&quot;&gt;гит-хуков&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;husky&quot;&gt;Husky&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/typicode/husky&quot;&gt;Инструмент&lt;/a&gt; для запуска команд при гит-хуках (commit, push).
Для начала установим его:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npm &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-D&lt;/span&gt; husky
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Затем в &lt;strong&gt;package.json&lt;/strong&gt; добавим секцию:&lt;/p&gt;
&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nl&quot;&gt;&quot;husky&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
   &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;hooks&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
     &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;pre-commit&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;YOUR_COMMAND_HERE&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
     &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;pre-push&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;YOUR_COMMAND_HERE&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
   &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;lint-staged&quot;&gt;Lint-staged&lt;/h3&gt;

&lt;p&gt;Второй &lt;a href=&quot;https://github.com/okonet/lint-staged&quot;&gt;инструмент&lt;/a&gt;, позволяющий выполнять команды только над индексированными файлами.
Установим его:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npm &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-D&lt;/span&gt; lint-staged
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Допишем в &lt;strong&gt;package.json&lt;/strong&gt; секцию:&lt;/p&gt;
&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nl&quot;&gt;&quot;lint-staged&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;*.{ts,tsx,js,css,less,json,md}&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;prettier --write&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Данная запись означает, что для файлов, чье расширение подходит по маске будет применяться команда &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;prettier --write&lt;/code&gt;.
С &lt;em&gt;lint-staged v10.x&lt;/em&gt; больше не нужно писать вторую команду &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gid add&lt;/code&gt;, файлы автоматически будут добавлены в индекс.&lt;/p&gt;

&lt;p&gt;Мы можем добавлять другие маски файлов и запускать над ними команды.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Как я понимаю, &lt;em&gt;lint-staged&lt;/em&gt; проходит только по тем файлам, которые были изменены. В этом его и фишка, что нам не нужно проверять все файлы проекта подходящие под маску.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Итоговая конфигурация этих двух инструментов может выглядеть так:&lt;/p&gt;
&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nl&quot;&gt;&quot;husky&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;hooks&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;pre-commit&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;lint-staged&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;pre-push&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;yarn run tslint --fix &amp;amp;&amp;amp; yarn run test&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;В этом примере перед пушем производится линтинг кода и запуск тестов.
Если какая-то команда завершится неудачно (EXIT_CODE != 0), то операция &lt;em&gt;commit&lt;/em&gt; или &lt;em&gt;push&lt;/em&gt; не будет произведена.&lt;/p&gt;

&lt;p&gt;Еще пример с другого проекта:&lt;/p&gt;
&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nl&quot;&gt;&quot;husky&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;hooks&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;pre-commit&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;npm run ts-compile-check &amp;amp;&amp;amp; lint-staged&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;компиляция&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;ts&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;и&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;запуск&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;lint-staged&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;lint-staged&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
   &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;*.(js|jsx|ts|tsx)&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
     &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;npm run lint&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;запуск&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;eslint&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;--fix&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
   &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Часто &lt;em&gt;eslint&lt;/em&gt; и &lt;em&gt;prettier&lt;/em&gt; используются вместе для автоматического исправления кода.
Их настройку и работу вместе разберем в другом посте.&lt;/p&gt;

&lt;p&gt;Таким образом поддерживается консистентность кодовой базы проекта, мы не даем и коммитить и пушить “плохой” код.
И что больше всего радует - это происходит автоматически.&lt;/p&gt;</content><author><name></name></author><category term="webpack" /><category term="husky" /><category term="lint-staged" /><summary type="html">Как часто вы пишете команды для запуска линтинга, тестов, форматирования кода? А как часто пушите лишние коммиты, содержащие исправления по code style проекта? В команде разработчиков сложно зачастую договориться о правилах форматирования кода, и на помощь нам приходит известный инструмент Prettier, который делает за нас всю грязную работу, а именно форматирует код согласно единому стилю по одной команде.</summary></entry><entry><title type="html">Использование разных ssh ключей для нескольких Bitbucket аккаунтов</title><link href="/git/bitbucket/ssh/2019/09/22/different-ssh-keys-multiple-bitbucket-accounts.html" rel="alternate" type="text/html" title="Использование разных ssh ключей для нескольких Bitbucket аккаунтов" /><published>2019-09-22T17:30:00+00:00</published><updated>2019-09-22T17:30:00+00:00</updated><id>/git/bitbucket/ssh/2019/09/22/different-ssh-keys-multiple-bitbucket-accounts</id><content type="html" xml:base="/git/bitbucket/ssh/2019/09/22/different-ssh-keys-multiple-bitbucket-accounts.html">&lt;p&gt;Понадобилось как-то использовать 2 аккаунта на Bitbucket - личный и рабочий. 
И при добавлении в рабочий существующего ssh ключа возникла ошибка, что данный ключ используется уже на другом аккаунте.
После долгих часов гугления и попыток, в итоге получилось решить эту проблему.&lt;/p&gt;

&lt;h4 id=&quot;создать-ключи-для-каждого-аккаунта&quot;&gt;Создать ключи для каждого аккаунта&lt;/h4&gt;

&lt;p&gt;Генерируем новую пару ключей с помощью команды ниже в директории ` ~/.ssh/`&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; ssh-keygen -t rsa -C &quot;user1&quot; -f &quot;user1&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Ключ -C означает комментарий чтобы обозначить ssh-ключ. Ключ -f указывает на имя файла.
Нужно создать ключи для всех аккаунтов, которые вы хотите добавить.&lt;/p&gt;

&lt;h4 id=&quot;добавить-публичный-ключ-в-аккаунты-bitbucket&quot;&gt;Добавить публичный ключ в аккаунты Bitbucket&lt;/h4&gt;

&lt;p&gt;Заходим в настройки аккаунта Bitbucket и добавляем ssh-ключ.&lt;/p&gt;

&lt;h4 id=&quot;конфигурируем-ssh&quot;&gt;Конфигурируем SSH&lt;/h4&gt;

&lt;p&gt;В папке &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.ssh/&lt;/code&gt; создаем файл с названием &lt;strong&gt;config&lt;/strong&gt; и вставляем туда конфиг ниже.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; #user1 account
 Host bitbucket.org-user1
     HostName bitbucket.org
     User git
     IdentityFile ~/.ssh/user1
     IdentitiesOnly yes

 #user2 account
 Host bitbucket.org-user2
     HostName bitbucket.org
     User git
     IdentityFile ~/.ssh/user2
     IdentitiesOnly yes
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Заменяем &lt;em&gt;user1&lt;/em&gt; и &lt;em&gt;user2&lt;/em&gt; соответственно нужными значениями.&lt;/p&gt;

&lt;h4 id=&quot;конфигурируем-git-репозиторий&quot;&gt;Конфигурируем Git репозиторий&lt;/h4&gt;

&lt;p&gt;Если нет локальной копии репозитория, то нужно склонировать его следующей командой:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; git clone git@bitbucket.org-user1:user1/your-repo-name.git    
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Если репозиторий уже склонирован, то нужно обновить origin:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git remote set-url origin git@bitbucket.org-user1:user1/your-repo-name.git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Если нужно поменять имя пользователя или email, то в папке проекта выполнить следующие действия:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git config user.name &quot;user1&quot;
git config user.email &quot;user1@example.com&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Заменить &lt;em&gt;user1&lt;/em&gt; именем из конфига.&lt;/p&gt;

&lt;p&gt;Теперь при попытке склонировать или обновить репозиторий ошибки быть не должно.&lt;/p&gt;</content><author><name></name></author><category term="git" /><category term="bitbucket" /><category term="ssh" /><summary type="html">Понадобилось как-то использовать 2 аккаунта на Bitbucket - личный и рабочий. И при добавлении в рабочий существующего ssh ключа возникла ошибка, что данный ключ используется уже на другом аккаунте. После долгих часов гугления и попыток, в итоге получилось решить эту проблему.</summary></entry><entry><title type="html">Создание виртуальных хостов в MAMP</title><link href="/macos/mamp/php/2019/09/20/create-virtual-hosts-mamp.html" rel="alternate" type="text/html" title="Создание виртуальных хостов в MAMP" /><published>2019-09-20T18:30:00+00:00</published><updated>2019-09-20T18:30:00+00:00</updated><id>/macos/mamp/php/2019/09/20/create-virtual-hosts-mamp</id><content type="html" xml:base="/macos/mamp/php/2019/09/20/create-virtual-hosts-mamp.html">&lt;p&gt;Чтобы поднять виртуальный хост на локальной машине, используя MAMP, необходимо:&lt;/p&gt;

&lt;h3 id=&quot;добавляем-домен-в-hosts&quot;&gt;Добавляем домен в hosts&lt;/h3&gt;

&lt;p&gt;Придумать имя хоста, например, &lt;em&gt;domain.local, domain.loc или domain.test&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Открыть файл &lt;em&gt;hosts&lt;/em&gt; через консоль &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sudo nano /etc/hosts&lt;/code&gt; и дописать имя хоста в строку с адресом 127.0.0.1, сохранить изменения и выйти.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;127.0.0.1    localhost domain.local
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;добавляем-виртуальные-хосты-в-apache-конфиг&quot;&gt;Добавляем виртуальные хосты в apache конфиг&lt;/h3&gt;

&lt;p&gt;Перейти в директорию &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/Applications/MAMP/conf/apache/extra/&lt;/code&gt; и открыть в редакторе файл &lt;em&gt;httpd-vhosts.conf&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Найти dummy примеры, удалить и добавить следующее:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;lt;VirtualHost *:80&amp;gt;
    DocumentRoot /Applications/MAMP/htdocs
    ServerName localhost
&amp;lt;/VirtualHost&amp;gt;


&amp;lt;VirtualHost *:80&amp;gt;
    DocumentRoot &quot;/Users/{username}/path/to/project&quot;
    ServerName domain.local
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Заменить &lt;em&gt;DocumentRoot&lt;/em&gt; и &lt;em&gt;ServerName&lt;/em&gt; своими значениями.&lt;/p&gt;

&lt;h3 id=&quot;включение-виртуальных-хостов-в-общий-конфиг&quot;&gt;Включение виртуальных хостов в общий конфиг&lt;/h3&gt;

&lt;p&gt;Далее открыть файл &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Applications/MAMP/conf/apache/httpd.conf&lt;/code&gt; и найти строчку&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# Virtual Hosts
# Include /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Раскомментировать вторую строчку с Include и сохранить файл.&lt;/p&gt;

&lt;h3 id=&quot;разрешаем-followsymlinks&quot;&gt;Разрешаем FollowSymLinks&lt;/h3&gt;

&lt;p&gt;В этом же файле &lt;em&gt;httpd.conf&lt;/em&gt; найти следующий фрагмент:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;lt;Directory /&amp;gt;
    Options Indexes FollowSymLinks
    AllowOverride None
&amp;lt;/Directory&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Заменить &lt;em&gt;None&lt;/em&gt; на &lt;em&gt;All&lt;/em&gt;.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;lt;Directory /&amp;gt;
  Options Indexes FollowSymLinks
  AllowOverride All
&amp;lt;/Directory
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;установка-порта-80-в-apache&quot;&gt;Установка порта 80 в apache&lt;/h3&gt;

&lt;p&gt;Установить порт apache 80 вместо 8888 в настройках MAMP.&lt;/p&gt;

&lt;p&gt;На этом все, осталось перезапустить процессы MAMP и все должно заработать.&lt;/p&gt;</content><author><name></name></author><category term="macos" /><category term="mamp" /><category term="php" /><summary type="html">Чтобы поднять виртуальный хост на локальной машине, используя MAMP, необходимо:</summary></entry><entry><title type="html">Создание symlink в Mac OS X</title><link href="/jekyll/post/2018/05/25/Create-symlinks-Mac-OSX.html" rel="alternate" type="text/html" title="Создание symlink в Mac OS X" /><published>2018-05-25T18:20:00+00:00</published><updated>2018-05-25T18:20:00+00:00</updated><id>/jekyll/post/2018/05/25/Create-symlinks-Mac%20OSX</id><content type="html" xml:base="/jekyll/post/2018/05/25/Create-symlinks-Mac-OSX.html">&lt;p&gt;Символическая ссылка (симлинк, symlink) - это запись, которая указывает на имя файла или директории. Символические ссылки можно создавать для каталогов и объектов, которые расположены в разных файловых системах. Если переименовать или переместить файл в другую директорию, символическая ссылка потеряет работоспособность.&lt;/p&gt;

&lt;h3 id=&quot;создание-символической-ссылки-в-mac-os-x&quot;&gt;Создание символической ссылки в Mac OS X&lt;/h3&gt;

&lt;p&gt;Для этого используем команду &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ln&lt;/code&gt; с флагом &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-s&lt;/code&gt;, что означает symbolic&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ln -s /path/to/file /path/to/symlink
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Чтобы создать или обновить симлинк, нужно использовать флаг &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-f&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ln -sf /path/to/file /path/to/symlink
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;При создании символических ссылок лучше использовать полные пути, а не относительные, в противном случае получим пустой файл.&lt;/p&gt;</content><author><name></name></author><category term="jekyll" /><category term="post" /><summary type="html">Символическая ссылка (симлинк, symlink) - это запись, которая указывает на имя файла или директории. Символические ссылки можно создавать для каталогов и объектов, которые расположены в разных файловых системах. Если переименовать или переместить файл в другую директорию, символическая ссылка потеряет работоспособность.</summary></entry><entry><title type="html">Настройка Nginx, PHP в Mac OS X</title><link href="/jekyll/post/2018/05/20/Install-Ningx-MacOSX.html" rel="alternate" type="text/html" title="Настройка Nginx, PHP в Mac OS X" /><published>2018-05-20T14:40:54+00:00</published><updated>2018-05-20T14:40:54+00:00</updated><id>/jekyll/post/2018/05/20/Install-Ningx-MacOSX</id><content type="html" xml:base="/jekyll/post/2018/05/20/Install-Ningx-MacOSX.html">&lt;p&gt;Потребовалось мне однажды настроить окружение на маке для одного проекта на PHP. Впервые столкнувшись с этим полез в гугл за мануалами. Но как это обычно бывает, с первого раза не завелось, и со второго тоже, и с пятого.. Так прошло несколько часов и вечер плавно перетек в ночь..&lt;/p&gt;

&lt;p&gt;На следующий день после некоторых телодвижений все заработало, и я хочу оставить свой мануал по настройке сие тут.&lt;/p&gt;

&lt;p&gt;Задача состояла в следующем: настроить виртуальный хост на папку /public проекта, подняв Nginx. Говно вопрос.&lt;/p&gt;

&lt;p&gt;На моем маке уже стоял менеджер пакетов &lt;strong&gt;Homebrew&lt;/strong&gt;, но если у вас его нет, скачать можно  &lt;a href=&quot;https://brew.sh/index_ru&quot;&gt;отсюда&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;установка&quot;&gt;Установка&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;Ставим nginx с помощью brew
    &lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;brew install nginx
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;Запускаем nginx
    &lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sudo nginx
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;Открываем в браузере ссылку, если видим приветственную надпись &lt;em&gt;Welcome to Nginx&lt;/em&gt;, значит nginx запущен и все хорошо.
    &lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;http://127.0.0.1:8080/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;Ставим PHP также с помощью brew. В Mac OS X PHP уже предустановлен, но можно и обновить.
    &lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;brew install php
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;конфигурация&quot;&gt;Конфигурация&lt;/h2&gt;

&lt;p&gt;Конфиг nginx по умолчанию находится по пути &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/usr/local/etc/nginx/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Создаем папки для локальных виртуальных хостов&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;mkdir -p /usr/local/etc/nginx/sites-{enabled,available}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Заменяем дефолтный конфиг &lt;em&gt;nginx.conf&lt;/em&gt; этим:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;worker_processes  1;

error_log  /usr/local/etc/nginx/logs/error.log debug;

events {
    worker_connections  256;
}

http {
    include             mime.types;
    default_type        application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] &quot;$request&quot; '
                      '$status $body_bytes_sent &quot;$http_referer&quot; '
                      '&quot;$http_user_agent&quot; &quot;$http_x_forwarded_for&quot;';

    access_log  /usr/local/etc/nginx/logs/access.log  main;

    sendfile            on;

    keepalive_timeout   65;

    index index.html index.php;

    include /usr/local/etc/nginx/sites-enabled/*;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Создаем файл project.local в sites-available&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;touch /usr/local/etc/nginx/sites-available/project.local
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Вставляем туда конфиг&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;server {
  listen                80;
  listen                [::]:80;
  server_name           project.local;

  location / {
    root /Users/{username}/Projects/project/public/;
    try_files  $uri  $uri/  /index.php?$args;
    index  index.html index.htm index.php;
  }

  location ~ \.php$ {
    root  /Users/{username}/Projects/project/public/;
    try_files  $uri  $uri/  /index.php?$args;
    index  index.html index.htm index.php;

    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;


    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_intercept_errors on;
    include fastcgi_params;
  }

}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Линкуем наш хост в sites-enabled (создаем симлинк)&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ln -s /usr/local/etc/nginx/sites-available/project.local /usr/local/etc/nginx/sites-enabled
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Добавляем наш хост в hosts &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nano /etc/hosts&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# Nginx sites

127.0.0.1        project.local
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Тестим конфиг nginx&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sudo nginx -t
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;И если ошибок/предупреждений нет, то обновляем новый конфиг nginx&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;brew services reload nginx
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Проверяем доступность созданного хоста&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;curl -IL http://project.local:8080
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Если видим что-то похожее ниже, то открываем в браузере &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;project.local&lt;/code&gt; и радуемся жизни!&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;HTTP/1.1 200 OK
Server: nginx/1.13.12
Date: Sun, 20 May 2018 21:07:25 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 10 Apr 2018 14:11:19 GMT
Connection: keep-alive
ETag: &quot;5accc607-264&quot;
Accept-Ranges: bytes
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;На этом установка и настройка окружения завершена. По возникшим проблемам всегда можно обращаться к всезнающему &lt;a href=&quot;https://google.ru&quot;&gt;Google&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UPD 25.05.2018&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Возникли проблемы при настройке второго локального хоста. При попытке открыть новый хост, открывался первый. Перезагрузка nginx не помогала. Проблема решилась перезагрузкой системы.&lt;/p&gt;</content><author><name></name></author><category term="jekyll" /><category term="post" /><summary type="html">Потребовалось мне однажды настроить окружение на маке для одного проекта на PHP. Впервые столкнувшись с этим полез в гугл за мануалами. Но как это обычно бывает, с первого раза не завелось, и со второго тоже, и с пятого.. Так прошло несколько часов и вечер плавно перетек в ночь..</summary></entry><entry><title type="html">Первый пост</title><link href="/jekyll/post/2018/04/14/first-post.html" rel="alternate" type="text/html" title="Первый пост" /><published>2018-04-14T21:40:54+00:00</published><updated>2018-04-14T21:40:54+00:00</updated><id>/jekyll/post/2018/04/14/first-post</id><content type="html" xml:base="/jekyll/post/2018/04/14/first-post.html">&lt;p&gt;Это первый пост, скорее всего его потом удалят. Но пусть он тут побудет немного.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;print_hi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;nb&quot;&gt;puts&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Hi, &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;print_hi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'Tom'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;#=&amp;gt; prints 'Hi, Tom' to STDOUT.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;</content><author><name></name></author><category term="jekyll" /><category term="post" /><summary type="html">Это первый пост, скорее всего его потом удалят. Но пусть он тут побудет немного.</summary></entry></feed>