Обзор бюджетного твердотельного накопителя transcend ssd230s (512 гб) на базе памяти 3d nand tlc

Введение

Одной из множества проблем над которой ломают голову веб-разработчики связана с зависимостями. У нас всех была ситуация, когда внедрение новых пакетов в ваш проект приносило больше проблем, чем собственно пользы.

Эта проблема особенно часто проявляется у PHP разработчиков. Это вполне обычная ситуация, когда программисты постоянно создают такие модули как персистентность данных с нуля. В результате — огромная трата ресурсов на дополнительные задачи — задачи, которые в противном случае могли бы быть выполнены с помощью уже существующих решений.

Composer — это удобный и простой менеджер зависимостей для PHP. Некоторые из вас, возможно уже знакомы с похожими менеджерами зависимостей, такими как PIP для Python или NPM для Node.js. Однако Composer поможет решить проблему со всеми зависимостями вашего проекта в одном месте.

Одна из функций Composer, которая заметно выделяет его среди других программ для управления зависимостями, таких как PEAR, это возможность решать зависимости на основе каждого проекта. Composer управляет зависимостями каждого из ваших проектов отдельно. Это означает, что у вас не будет неиспользуемых библиотек — неплохой бонус к уменьшению размера вашего проекта. Надо также упомянуть, что вы можете установить пакеты по всей системе с помощью Composer. Это можно сделать с помощью специальной глобальной команды, однако, мы не будем сильно углубляться в эту тему, просто из соображения сохранения простоты и удобства.

В этом руководстве вы узнаете, как установить Composer, чтобы использовать его в своих будущих PHP проектах. Просто следуйте этому пошаговому руководству и вы легко со всем справитесь.

Внедрение composer в папку /local/

Шаг 1
Добавляем в

public_html/local/composer.phar
public_html/local/vendor/*
public_html/local/composer.json

Шаг 2
Скачиваем файл с сайта https://getcomposer.org (последнюю версию скачиваем отсюда) либо качаем из консоли.
Шаг 3
Закидываем файл в папку  /local/
и дальше два пути:

Если у вас уже есть подготовленный файлик composer.json , то выполняем:

php composer.phar install

Если вы устанавливаете composer в первый раз и у вас нет своего готового composer.json , то выполняем:

php composer.phar init

В результате он запросит у вас данные по проекту, инициализируйте проект вашими данными.
В итоге сгенерируется  и нужно выполнить команду

Подтянуться все зависимости, и загрузятся в папку , которая предварительно будет создана в папке .
Шаг 4
И самое главное — composer автоматически сгенерирует файл , который надо будет добавить в :

require_once($_SERVER . '/local/vendor/autoload.php');

Plugin configuration

The plugin reads its configuration from the section of your
composer.json’s section. An setting is required to tell
Composer Merge Plugin which file(s) to merge.

include

The setting can specify either a single value or an array of values.
Each value is treated as a PHP pattern identifying additional
composer.json style configuration files to merge into the root package
configuration for the current Composer execution.

The following sections of the found configuration files will be merged into
the Composer root package configuration as though they were directly included
in the top-level composer.json file:

recurse

By default the merge plugin is recursive; if an included file has
a section it will also be processed. This functionality can be
disabled by adding a setting.

replace

By default, Composer’s conflict resolution engine is used to determine which
version of a package should be installed when multiple files specify the same
package. A setting can be provided to change to a «last
version specified wins» conflict resolution strategy. In this mode, duplicate
package declarations found in merged files will overwrite the declarations
made by earlier files. Files are loaded in the order specified by the
setting with globbed files being processed in alphabetical order.

ignore-duplicates

By default, Composer’s conflict resolution engine is used to determine which
version of a package should be installed when multiple files specify the same
package. An setting can be provided to change to
a «first version specified wins» conflict resolution strategy. In this mode,
duplicate package declarations found in merged files will be ignored in favor
of the declarations made by earlier files. Files are loaded in the order
specified by the setting with globbed files being processed in
alphabetical order.

Note: and modes are mutually
exclusive. If both are set, will be used.

merge-extra

A setting enables the merging the contents of the
section of included files as well. The normal merge mode for the extra
section is to accept the first version of any key found (e.g. a key in the
master config wins over the version found in any imported config). If
mode is active () then this behavior changes
and the last key found will win (e.g. the key in the master config is replaced
by the key in the imported config). If is specified
then, the sections are merged similar to array_merge_recursive() — however
duplicate string array keys are replaced instead of merged, while numeric
array keys are merged as usual. The usefulness of merging the extra section
will vary depending on the Composer plugins being used and the order in which
they are processed by Composer.

Note that sections are excluded from the merge process, but are
always processed by the plugin unless is disabled.

merge-scripts

A setting enables merging the contents of the
section of included files as well. The normal merge mode for the
scripts section is to accept the first version of any key found (e.g. a key in
the master config wins over the version found in any imported config). If
mode is active () then this behavior changes
and the last key found will win (e.g. the key in the master config is replaced
by the key in the imported config).

Оставьте отзыв

Наша цель — сделать семейство инструментов ARK максимально полезным для вас ресурсом. Оставьте свои вопросы, комментарии или предложения здесь. Вы получите ответ в течение 2 рабочих дней.

Ваши комментарии отправлены. Спасибо за ваш отзыв.

Предоставленная вами персональная информация будет использована только для ответа на этот запрос. Ваше имя и адрес электронной почты не будут добавлены ни в какие списки рассылок, и вы не будете получать электронные сообщения от корпорации Intel без вашего запроса. Нажимая кнопку «Отправить», вы подтверждаете принятие Условий использования Intel и понимание Политики конфиденциальности Intel.

Публикация в VCS

Как только у Вас появится VCS репозиторий (система управления версиями, например git) содержащий
файл , Ваша библиотека уже может быть установлена через Composer. В этом
примере, мы будем публиковать библиотеку на GitHub под
.

Теперь, чтобы проверить установку пакета , мы создаем новый
локальный проект. Будем называть его . Этот блог будет зависеть от
, который в свою очередь зависит от . Мы можем
добиться этого путем создания где-то нового каталога ,
содержащего со следующим содержимым:

{
    "name": "acme/blog",
    "require": {
        "acme/hello-world": "dev-master"
    }
}

Имя в этом случае не требуется, поскольку мы не хотим публиковать блог
как библиотеку. Имя здесь добавляется чтобы уточнить, какой
в настоящее время описывается.

Теперь мы должны сообщить приложению блог где найти зависимость .
Мы делаем это путем добавления репозитория в спецификации пакета блога :

{
    "name": "acme/blog",
    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/username/hello-world"
        }
    ],
    "require": {
        "acme/hello-world": "dev-master"
    }
}

Для более подробной информации о том, как работают репозитории пакетов и какие другие типы
доступны, см. Репозитории.

Вот и все. Теперь можно установить зависимости, запустив команду Composer
!

Резюме: Любой репозиторий git/svn/hg/fossil содержащий может быть
добавлен в Ваш проект, указав репозитории пакетов и объявив зависимости в поле .

Эволюция разработчика

Стадия 1
Т. к. городить модули надоедает и не всегда это целесообразно, многие следуют более простому решению проблемы — это писать код в . Со временем файл разрастается, накапливаются десятки функций и классов.
Стадия 2
Наступает следующий этап — разработчик инклудит два файла в . В одном классы, во втором функции. Возможно даже, он начал отделять каждый класс в отдельный файл и вместо одного инклуда с файлом классов, их столько сколько классов. Функции тоже можно раскидать по файлам, названия которых могут однозначно указать к какому модулю, либо компоненту они относятся(sale, catalog и т.п.).
Стадия 3
Написан свой автозагрузчик(autoload), может без следования стандартам(psr-0, psr-4), а может уже придерживается стандарта. А еще круче, если используются функции библиотеки для автозагрузки.
Стадия 4

, кажется стремиться уже некуда.
Стадия 5
И вот тут вы услышали про .

Проблема с форком

Я форкнул репозиторий, который имеется в packagist.org, и воспользовался инструкцией:

{
    "name": "my.name/test",
    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/yapro/php-barcode-generator"
        }
    ],
    "require": {
        "yapro/php-barcode-generator": "v0.2.2"
    }
}

Однако, при выполнении команды composer update yapro/php-barcode-generator, я постоянно получал ошибку:

И быть может, я неправильно прописал, но настройки минимально стабильной версии никак не помогли мне:

    "minimum-stability": "dev",
    "prefer-stable" : true,
    "require": {
        "yapro/php-barcode-generator": "v0.2.2*@dev"
    }

В итоге, пришлось отказаться от инструкции «type»: «vcs», и воспользоваться «type»:»package».

Custom Install Paths

If you are consuming a package that uses the you can
override the install path with the following extra in your :

{
    "extra": {
        "installer-paths": {
            "your/custom/path/{$name}/": ["shama/ftp", "vendor/package"]
        }
    }
}

A package type can have a custom installation path with a prefix.

{
    "extra": {
        "installer-paths": {
            "your/custom/path/{$name}/": 
        }
    }
}

You can also have the same vendor packages with a custom installation path by
using the prefix.

{
    "extra": {
        "installer-paths": {
            "your/custom/path/{$name}/": 
        }
    }
}

These would use your custom path for each of the listed packages. The available
variables to use in your paths are: , , .

Указание версии

Когда Вы публикуете пакет на Packagist, он выводит информацию о версии
из VCS (git, svn, hg, fossil). Это означает, что Вам не придется
явно объявлять версию. Читайте (теги) и (ветки) чтобы увидеть, как
номера версий извлекаются из них.

Если Вы создаете пакеты вручную и действительно нужно указать версию явно, то
можно просто добавить поле (версии):

{
    "version": "1.0.0"
}

Теги

Для каждого тега, который выглядит как версия, пакет с тегом этой версии будет
создан. Он должен соответствовать ‘X.Y.Z’ или ‘vX.Y.Z’, с необязательным суффиксом
(), (), () или . За номером также может следовать суффикс.

Вот несколько примеров допустимых тегов имен:

  • 1.0.0
  • v1.0.0
  • 1.10.5-RC1
  • v4.4.4-beta2
  • v2.0.0-alpha
  • v2.0.4-p1

Ветви

Для каждой ветви будет создана версия пакета разработки. Если имя ветви выглядит как версия,
версия будет (branchname — имя ветви). Например для ветки получится версия
( добавляется по техническим причинам, чтобы убедиться, что она распознается как ветвь).
Ветка также будет действительна и превратится соответственно в .
Если ветка не выглядит как версия, она будет .
Ветка приводит к версии .

Ниже приведены некоторые примеры имен версий веток:

  • 1.x
  • 1.0 (приравнивается к 1.0.x)
  • 1.1.x

Псевдонимы

Это возможность создания псевдонимов имён веток версий. Например, Вы можете
создать псевдоним для как , что позволит Вам добавлять
зависимость в пакетах как .

Смотрите Псевдонимы для более подробной информации.

Disabling installers

There may be time when you want to disable one or more installers from .
For example, if you are managing a package or project that uses a framework specific installer that
conflicts with but also have a dependency on a package that depends on .

Installers can be disabled for your project by specifying the extra
property. If set to , , or all installers
will be disabled.

{
    "extra": {
        "installer-disable": true
    }
}

Otherwise a single installer or an array of installers may be specified.

{
    "extra": {
        "installer-disable": 
    }
}

Note: Using a global disable value (, , or ) will take precedence over individual
installer names if used in an array. The example below will disable all installers.

{
    "extra": {
        "installer-disable": 
    }
}

Как установить Composer?

Установка Composer может выполняться по-разному. Она также зависит от используемой среды и операционной системы. Рассмотрим различные варианты.

Установка Composer в Ubuntu, выполняющейся в подсистеме Windows для Linux (WSL)

Для установки Composer в Windows 10 на подсистему Windows для Linux (WSL) необходимо выполнить следующие команды:

Первая команда выполняет загрузку скрипта установщика с сайта «getcomposer.org». Вторая команда выполняет запуск этого установщика. В процессе своей работы установщик проверит некоторые настройки «php.ini», предупредит вас, если они установлены неправильно, а затем загрузит последний «composer.phar» в текущий каталог. Последняя или третья команда просто удалит загруженный установщик, который ранее использовался для установки Composer.

Phar — это исполняемые файлы (программы), которые выполняются посредством php интерпретатора.

Если при установке php пакетов у вас выводиться ошибки на отсутствие прав записи в каталог «~/.composer/cache», то в командной строке просто запустите данную команду:

Для установки Composer глобально, т.е. чтобы он был доступен с помощью команды необходимо дополнительно выполнить ещё следующую команду:

Эта команда переместит файл «composer.phar» из директории пользователя в директорию «/usr/local/bin» и уберёт у него расширение «phar».

Установка Composer на OpenServer (в Windows)

В OpenServer по умолчанию уже установлен Composer. Находится он в зависимости от выбранной версии PHP (устанавливается в настройках OpenServer) в директории «OSPanel\modules\PHP_*\».

Работа с Composer в OpenServer по умолчанию осуществляется в собственной консоли. Для того чтобы открыть эту консоль необходимо нажать на значок Open Server правой кнопкой мыши в области уведомлений и в открывшемся контекстном меню найти соответствующий пункт.

В консоли для проверки того, что Composer подключен, например, можно ввести команду:

Эта команда также отобразит версию Composer.

Если при выполнении этой команды отобразится сообщение, что версия Composer устарела, то её можно обновить. Осуществляется это посредством выполнения следующей команды:

Usage

All commands should be run from the root of your project, where the file is located.

Workflow

Typically, you will want to require one of your own Composer packages in an application.
With Studio, you can pull in your local copy of the package instead of the version hosted on Packagist.
The kicker: You can keep developing your library while you dogfood it, but you won’t need to change your composer.json file.

Loading local packages

To use one of your own libraries within your application, you need to tell Studio where it can locate the library.
You can do so with the command.
When Composer resolves its dependencies, Studio will then pitch in and symlink your local directory to Composer’s directory.

So, to have Studio manage your awesome world domination library, all you have to do is run the following command:

This command should create a file in the current working directory.
It contains a list of directories for Studio to load.

Next, if you haven’t already done so, make sure you actually require the package in your composer.json:

And finally, tell Studio to set up the symlinks:

If all goes well, you should now see a brief message along the following as part of Composer’s output:

This is what will happen under the hood:

  1. Composer begins checking dependencies for updates.
  2. Studio jumps in and informs Composer to prefer packages from the directories listed in the file over downloading them from Packagist.
  3. Composer generates proper autoloading rules for the Studio packages.
  4. For non-Studio packages, Composer works as always.

Pro tip: If you keep all your libraries in one directory, you can let Studio find all of them by using a wildcard:

Kickstarting package development

If you haven’t started world domination yet, Studio also includes a handy generator for new Composer packages.
Besides the usual ceremony, it contains several optional components, such as configuration for unit tests, continuous integration on Travis-CI and others.

First, we need to create the local directory for the development package:

After asking you a series of questions, this will create (or download) a package in the subdirectory inside the current working directory.
There is a good chance that you need a little time to develop this package before publishing it on Packagist.
Therefore, if you ran this command in a Composer application, Studio will offer you to load your new package immediately.
This essentially comes down to running .

Finally, don’t forget to use to actually add your package as a dependency.

Command Reference

create: Create a new package skeleton

This command creates a skeleton for a new Composer package, already filled with some helpful files to get you started.
In the above example, we’re creating a new package in the folder in your project root.
All its dependencies will be available when using Composer.

During creation, you will be asked a series of questions to configure your skeleton.
This will include things like configuration for testing tools, Travis CI, and autoloading.

create —options: Provide specific options to Git when loading the repository

This will load the given Git repository and checkout a specific branch.
To have an overview of all the options available to you, check and .

load: Make all packages from the given local path available to Composer

This will make sure all packages in the directory (paths with wildcards are supported, too) will be autoloadable using Composer.

unload: Stop managing a local path

This will remove the path from the studio.json configuration file.
This means any packages in that path will not be available to Composer anymore (unless they are still hosted on Packagist).

This does not remove the package contents from the file system.
See for completely removing a package.

You can reload the path using the command.

scrap: Remove a package

Sometimes you want to throw away a package.
You can do so with the command, passing a path for a Studio-managed package:

Don’t worry — you’ll be asked for confirmation first.

Шаг 4 — Обновление зависимостей вашего проекта

Теперь нам осталось лишь узнать, как производить обновление пакетов. Сделать это можно двумя способами:

Универсальное обновление

Для проверки и обновления всех ваших пакетов и зависимостей, впишите в терминал следующую команду:

composer update

Обновление конкретного пакета

Иногда, вам может понадобиться проверить обновления для определенного пакета. Без проблем, просто выполните команду ниже:

composer update vendor/package vendor2/package2

Не забудьте поменять vendor/package на имя пакета, который вы хотите обновить.

Composer также автоматически обновит файлы composer.json и composer.lock для соответствия текущему состоянию вашего проекта.

Пакеты платформы

Composer содержит пакеты для текущей платформы, которые являются виртуальными пакетами для предметов, которые установлены в системе, но не фактически устанавливаемые через Composer. В это понятие включается сам PHP, PHP расширений и некоторые системные библиотеки.

  • представляет версию PHP пользователя, позволяя применить ограничения
    , например . Если требуется 64bit версия php, Вы можете
    потребовать пакет
  • представляет версию среды выполнения HHVM (aka HipHop Virtual
    Machine) и позволяет применять ограничения, например, ‘>=2.3.3’.
  • позволяет требовать расширения PHP (включая расширения ядра).
    Управление версиями может быть вполне согласованно здесь, так что это часто
    хорошая идея, для того, чтобы просто установить ограничение . Примером расширения
    с именем пакета является .
  • позволяет накладывать ограничения на версии библиотек, используемых
    PHP. Доступны следующие: , , , ,
    , , , .

Вы можете использовать для получения списка локальных пакетов доступных на Вашей платформе.

Create shim files

Your computer does not know how to run the script, but it does know how to run a batch file from a Windows command console, or a shell script from Cygwin or Git Bash. Adding these shims is how the command get translated into running this file. We will create these now.

Create a file called in your directory and add the following to it:

@ECHO OFF
php "%~dp0%composer.phar%" %*

Shell script

Create a file called in your directory (note there is no file extension) and add the following to it, making sure that you save it with Unix line-endings.:

#!/bin/sh

# This file must be saved with Unix line endings, or Cygwin will choke

dir=$(d=$(dirname "$0"); cd "$d" && pwd)

if command -v 'cygpath' >/dev/null 2>&1; then
  dir=$(cygpath -m $dir);
fi

dir=$(echo $dir | sed 's/ /\ /g')
php "${dir}/composer.phar" $*

Шаг 3 — Использование скрипта автозагрузки

Если вы дошли до этой части руководства, все последующее вам должно даваться очень легко. Ваши зависимости были установлены и ваш проект готов к работе. Почти.

Теперь вам необходимо загрузить эти зависимости в ваш PHP скрипт. Если бы не файл автозагрузки Composer, мы бы потратили довольно много времени. Файл находится в папке vendor вашего проекта. Вставка этого единственного файла в ваш PHP скрипт обеспечит видимость каждого пакета установленного для вашего проекта скрипту.

Чтобы добиться автозагрузки, просто напишите следующую строку перед объявлением или созданием любых новых переменных в вашем скрипте:

require 'vendor/autoload.php'

Пример скрипта ниже поможет вам лучше это понять:

require 'vendor/autoload.php'
PHP_Timer::start();
// ваш код
$time = PHP_Timer::stop();
var_dump($time);
print PHP_Timer::secondsToTimeString($time);

Запустите скрипт. В процессе выполнения он должен отображать результат подобный этому:

double(1.0967254638672E-5)
0 ms

Install или Update?

Часто разработчики теряются когда они должны использовать . Как только вы начнёте думать об этом как о действиях с lock файлом, нежели как о зависимостях, всё встанет на свои места и будет более понятным.

Команда делает следующее:

  • Проверяет существует ли
  • если нет, резолвит зависимости и создаёт его
  • если существует, устанавливает версии, указанные в нём

Команда :

  • Проверяет
  • Определяет последние версии на основе указанных в этом файле
  • Устанавливает последние версии
  • Обновляет в соответствии с установленными

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

Есть одно исключение из правила. В том случае, если вы устанавливаете что-то вроеде Zend Framework 2 Skeleton App, зависимости должны быть обновлены как только вы установили подобный каркас. Это потому, что Skeleton App является эдаким мета-приложением (карксом-примером). Соответственно в этом случае вы захотите «подтянуть» последние версии зависимостей, которые станут отправной точкой для начала разработки. Поэтому не коммитится в репозитории подобных мета-приложений.

Download Composer

Decide where you want to install Composer to. If you wish to set it up for all users, please ensure that the directory you choose is writeable by everyone. Once you have created the directory, (change directory) to it in your command window and type:

php -r "eval('?>'.file_get_contents('https://getcomposer.org/installer'));"

which will download Composer into your directory. There are other ways of doing this. If you have installed you can type:

curl -s https://getcomposer.org/installer | php

Or if you have installed you can use the above command in Git Bash. Note that if you see any Message Box errors running Git Bash, click past these and check that Composer has downloaded — these errors can sometimes be caused by an extension being listed in your php.ini after other extensions that require it.

If the installation has failed, then read the errors that are displayed, correct them in your php.ini and try again. Otherwise type and you should see the Composer help displayed.

Current Supported Package Types

Framework Types
Aimeos
Asgard
Attogram
AGL
Bonefish
AnnotateCms
Bitrix (deprecated) (deprecated) (deprecated)
CakePHP 2+
Chef
CiviCrm
CCFramework
Cockpit
CodeIgniter
concrete5
Craft
Croogo
Decibel
Dframe
DokuWiki
Dolibarr
Drupal
Elgg
Eliasis
ExpressionEngine 3
eZ Platform
FuelPHP v1.x
FuelPHP v2.x
Grav
Hurad
ImageCMS
iTop
Joomla
Kanboard
Kirby
Known
KodiCMS
Kohana
Lan Management System
Laravel
Lavalite
Lithium
Magento
majima
Mako
MantisBT
Mautic
Maya
MODX
MODX Evo
MediaWiki
October
OntoWiki
OXID
Osclass
MODULEWork
Moodle
Piwik
phpBB
Pimcore (deprecated, only used for versions
Plentymarkets
PPI
Puppet
Porto
RadPHP
REDAXO
REDAXO bestyle-plugin
REDAXO V5.*
REDAXO V5.* bestyle-plugin
ReIndex
Roundcube
shopware
SilverStripe
SiteDirect
SMF
SyDES
Sylius
symfony1
TAO
Tusk
TYPO3 Flow
TYPO3 CMS
UserFrosting
Vanilla
Vgmcp
WHMCS
Wolf CMS
WordPress
YAWIK
Zend
Zikula
Prestashop
Phifty

Выкладка (deploy)

При deploy-е приложения, имея в вашем репозитории, вы должны использовать команду . Так мы будем уверены, что на production сервере используются те же самые версии пакетов, как и при разработке. А также это значит, что Composer-у не требуется выполнять разрешение зависимостей и искать требуемые версии, что увеличивает скорость разворачивания.

Наличие файла также обеспечивает консистентность между кластерами серверов, если вы запускаете Composer отдельно на каждой машине. Это позволяет вам развернуть новые ноды(машины) неделями или месяцами позже, не беспокоясь о несовпадении версий зависимостей.

Настройка под битрикс

Первое, что нужно сделать перед установкой  — это решить где расположить папку и файлы . По этому вопросу разработчики разделяются на 3 лагеря:

  1. на уровне с корневой папкой проекта(т.е. на одном уровне у вас будут лежать: , , )
  2. в папке 
  3. в папке 
  4. Кто-то может расположить в корне проекта, но этот подход однозначно не правильный.

Разберем все способы по-порядку.

Первый я подглядел тут (довольно познавательное видео, рекомендую к просмотру) . Так устроен , сторонние системные файлы, модули и другие разработки подгруженные через  хранятся в  папке на уровне с папкой . Считаю верным решением.

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

Третий вариант тоже будет верным решением. Установка по этому методу рассмотрена здесь. По этому методу и я проведу установку.

Четвертый подход вызовет негодование у сторонников 2 и 3 подходов( и 1-ого тоже). «Как же так, есть папка  , есть папка , а он хочет в корень засунуть? Вот чудак!».
Получается какой-то недоделанный первый метод, но в корне с неверной идеологией. Зачем папку с логикой оставлять в корне, получается совсем не структурировано.

Какой метод выбрал я?
Так как, у меня не было возможности использовать первый метод, я стал сторонником второго метода. И далее расскажу, как я внедрял  в папку 

Contributing

Bug, feature requests and other issues should be reported to the GitHub
project. We accept code and documentation contributions via Pull Requests on
GitHub as well.

  • Tests are encouraged. Our test coverage isn’t perfect but we’d like it to
    get better rather than worse, so please try to include tests with your
    changes.
  • Keep the documentation up to date. Make sure and other
    relevant documentation is kept up to date with your changes.
  • One pull request per feature. Try to keep your changes focused on solving
    a single problem. This will make it easier for us to review the change and
    easier for you to make sure you have updated the necessary tests and
    documentation.
Ссылка на основную публикацию