Symfony2 - створення власного набору постачальників - проект та стратегія git


79

Ми розглядаємо можливість створити власний commonпакет для відображення сутності та служб для використання в декількох окремих додатках. Набір повинен бути легким для модифікації, запуску, включення та тестування. Я знаю про найкращі практики структурування пакетів , але не знаю, яку gitстратегію використовувати, коли мова йде про розробку.

Чи слід нам створювати commonпакет як цілий проект і зафіксувати ціле сховище на нашому git-сервері, чи краще запустити керування вихідними кодами лише для кореня commonпакета і натискати лише його вміст? Я бачу такий підхід у наборах, доступних на github, але я не знаю легкого та зручного способу розробити набори таким чином.

Відповіді:


177

Створіть новий порожній проект 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" : "demo@company.com"
    }],
    "keywords" : [
        "demo bundle"
    ],
    "license" : [
        "MIT"
    ],
    "require" : {
    },
    "autoload" : {
        "psr-0" : {
            "Company\\DemoBundle" : ""
        }
    },
    "target-dir" : "Company/DemoBundle",
    "repositories" : [{
    }],
    "extra" : {
    "branch-alias" : {
            "dev-master" : "some_version-dev"
        }
    }
}

Тепер у вас є базова структура вашого пакета

Використовуйте його в іншому проекті

composer.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

app / AppKernel:

new Company\DemoBundle\CompanyDemoBundle(),

Попрацюйте над цим

  • Ви можете клонувати свій DemoBundle в src/Companyпапці, а потім встановити його вручну
  • Ви можете використовувати символічне посилання

Висновок

Ви можете розробити та протестувати свій пакет у своєму першому проекті та використовувати його з github та композитором у другому проекті.


Це хороший крок за кроком, однак я б запропонував розміщувати власні сховища, а також використовувати Satis для обслуговування приватних залежностей: getcomposer.org/doc/articles/…
Борис Гері

звичайно, але, можливо, у нього є приватне сховище в github.
Вінсент Барро

Чудова відповідь @VBee! Кілька днів тому я проводив дослідження з тієї ж теми, але мене більше цікавило використання приватних репозиторіїв Git або локальних репо (бажано).
Йован Перович

@VBee Чудовий підручник, дякую! Приватне репо не є проблемою - у нас є власний git-сервер. Проблема в тому, що я насправді не розумію, як розробити загальний модуль у команді за допомогою вашого рішення. Чи кожен розробник повинен створювати новий sf2проект і cloneце репо src/? А як щодо composer.lockосновного проекту та використання його для забезпечення однакової версії кожної бібліотеки в команді? Якщо ви знаєте хороший та ефективний спосіб це зробити, додайте його до своєї відповіді. Дякую! :)
ex3v

3
Просто друкарська помилка composer.phat має бути composer.phar
Стефан Шампань

16

Важливим моментом є те, що ви можете зробити свій репо від / постачальника. Справді, композитор створює другий пульт, що називається "композитор", для кожного пакета (або пакета), який посилається на репо пакета, щоб ви могли працювати над ним у робочому контексті. Тож хороша практика - зареєструвати свій пакет у вашому composer.json для всіх ваших проектів і взяти на себе зобов’язання /vendor/MyCompany/MyBundleз будь-якого проекту.

Як доказ - просто запустите git remote -vбудь-який комплект вашого постачальника.

Поганою практикою було б розглядати свій пакет як окремий проект і мати з ним посилання. Основна причина, через яку це погана практика, полягає в тому, що ви не зможете оголосити про залежності за допомогою вашого пакета. Більше того, у вас будуть певні труднощі з розгортанням ваших проектів.


Я створюю власний пакет постачальників. Я хочу помістити цей комплект, наприклад, на GitHub і використовувати його в інших проектах. Я повинен створити новий Bundle у /srcабо в /vendorкаталозі на початку? Коли я включаю цей комплект до іншого проекту, в якому він буде знаходитися, /vendorале де я повинен їх генерувати на початку?
Exit196

5
Створіть новий порожній проект у GitHub, який буде зберігати ваш пакет. Зафіксуйте в ньому composer.json. Ви навіть можете зробити дуже простий composer.json, лише з назвою та описом вашого набору. Повернувшись до свого проекту, додайте вимогу до вашого нового набору та виконайте a composer update. Тепер ви повинні побачити ваш порожній комплект в папці постачальника, і ви можете працювати в ньому. Якщо ви хочете, щоб ваш пакет був загальнодоступним, додайте його до Packagist.
flouflou2000

4

У 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.json autoloadрозділ:

"autoload": {
    "psr-4": {
        "Acme\\AcmeFooBundle\\": "lib/AcmeFooBundle/src/",
    }
}, 

і біжи composer dump-autoload.

Тепер вам потрібно лише додати клас набору до config/bundles.php:

return [
    ...
    Acme\AcmeFooBundle\AcmeFooBundle::class => ['all' => true],
];

та введення залежностей для завантаження конфігурації з вашого пакета.

Якщо ви хочете перевірити свої послуги перед додаванням інжекції залежностей, ви можете просто підключити їх автоматично за адресою config/services.yml:

services:
    ...
    Acme\AcmeFooBundle\Services\Foo: ~

Це все. Дотримуйтесь найкращих практик і продовжуйте кодування.

PS: Я опублікував допис із кількома порадами щодо розробки багаторазових комплектів Symfony .


До речі, я також створив проект з розробки багаторазових пакетів: github.com/msalsas/symfony-bundle-skeleton
Manolo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.