Symfony2 - создание собственного пакета поставщиков - проект и стратегия git
Мы рассматриваем возможность создания нашего собственного common
пакета для сопоставления сущностей и сервисов для использования в нескольких отдельных приложениях. Пакет должен быть легко модифицируемым, запускаемым, включаемым и тестируемым. Я знаю о Лучших методах структурирования пакетов, но я не знаю, какую стратегию git
использовать, когда дело доходит до разработки.
Должны ли мы создать пакет common
как целый проект и передать весь репозиторий на наш сервер git, или лучше запустить систему управления версиями только для корня common
связывать и толкать только его содержимое? Я вижу этот подход в пакетах, доступных на github
, но я не знаю простого и удобного способа разработки пакетов таким образом.
3 answers
Создайте новый пустой проект symfony
php composer.phar create-project symfony/framework-standard-edition demo/ 2.4.1
cd demo
Создать новый пакет
(например src/Company/DemoBundle
)
php app/console generate:bundle
cd src/Company/DemoBundle/
Введите свой репозиторий github в src/Company/DemoBundle
git init
touch README.md
git add .
git commit -m "initial commit"
git remote add origin https://github.com/YourAccount/DemoBundle.git
git push -u origin master
Добавьте файл composer.json
src/Company/DemoBundle/composer.json
:
{
"name" : "company/demobundle",
"description" : "A demo bundle",
"type" : "symfony-bundle",
"authors" : [{
"name" : "demo",
"email" : "[email protected]"
}],
"keywords" : [
"demo bundle"
],
"license" : [
"MIT"
],
"require" : {
},
"autoload" : {
"psr-0" : {
"Company\\DemoBundle" : ""
}
},
"target-dir" : "Company/DemoBundle",
"repositories" : [{
}],
"extra" : {
"branch-alias" : {
"dev-master" : "some_version-dev"
}
}
}
Теперь у вас есть базовая структура вашего пакета
Используйте его в другом проекте
Композитор.json:
[...]
"require" : {
[...]
"company/demobundle" : "dev-master"
},
"repositories" : [{
"type" : "vcs",
"url" : "https://github.com/Company/DemoBundle.git"
}],
[...]
Сделайте:
curl -sS https://getcomposer.org/installer | php
php composer.phar update company/demobundle
Приложение/ядро приложения:
new Company\DemoBundle\CompanyDemoBundle(),
Работайте над этим
- Вы можете клонируйте свой дембель в папку
src/Company
, затем установите его вручную - Вы можете использовать символическую ссылку
Заключение
Вы можете разработать и протестировать свой пакет в своем первом проекте и использовать его с github и composer во втором проекте.
Важный момент, который следует знать, заключается в том, что вы можете внести в свое репо от /поставщика. Действительно, composer создает второй пульт дистанционного управления под названием "composer" для каждого пакета (или пакета), который ссылается на репозиторий пакета, чтобы вы могли работать с ним в рабочем контексте.
Поэтому хорошей практикой является регистрация вашего пакета в файле composer.json для всех ваших проектов и фиксация из вашего /vendor/MyCompany/MyBundle
, из любого проекта.
В качестве доказательства просто запустите git remote -v
из любого пакета вашего поставщика.
В плохой практикой было бы рассматривать ваш пакет как отдельный проект и иметь символические ссылки с ним. Основная причина, по которой это плохая практика, заключается в том, что вы не сможете объявлять иждивенцы с вашим пакетом. Кроме того, у вас возникнут некоторые трудности с развертыванием ваших проектов.
В Symfony4 команда generate:bundle
больше недоступна. Вместо этого вы можете следовать этому руководству.
Сначала создайте проект с помощью:
composer create-project symfony/website-skeleton my-project
Затем создайте каталог my-project/lib/AcmeFooBundle/src
. Здесь будет жить твой сверток. Пространство имен для этого каталога будет Acme\AcmeFooBundle
, поэтому, если вы создадите класс обслуживания в lib/AcmeFooBundle/src/Service/Foo.php
, его пространство имен будет Acme\AcmeFooBundle\Service
.
Теперь нам нужно сказать загрузчику composer, чтобы он искал новые классы в этом новом каталоге, поэтому нам нужно отредактировать composer.json
autoload
раздел:
"autoload": {
"psr-4": {
"Acme\\AcmeFooBundle\\": "lib/AcmeFooBundle/src/",
}
},
И беги composer dump-autoload
.
Теперь вам нужно только добавить свой класс bundle в config/bundles.php
:
return [
...
Acme\AcmeFooBundle\AcmeFooBundle::class => ['all' => true],
];
И внедрение зависимостей для загрузки конфигурации из вашего пакета.
Если вы хотите проверить свои сервисы перед добавлением внедрения зависимостей, вы можете просто автоматически подключить их по адресу config/services.yml
:
services:
...
Acme\AcmeFooBundle\Services\Foo: ~
Вот и все. Следуйте рекомендациям и продолжайте кодировать.
PS: Я опубликовал пост с несколькими советами по разработке Symfony многоразовые пакеты.