Symfony2 - Erstellen eines eigenen Vendor Bundle - Projekt- und Git-Strategie

78

Wir erwägen, ein eigenes commonBundle für Entity Mapping und Services für die Verwendung in wenigen separaten Apps zu erstellen . Ein Bundle sollte leicht zu ändern, auszuführen, einzuschließen und zu testen sein. Ich kenne Best Practices für die Strukturierung von Bundles , weiß aber nicht, welche gitStrategie ich bei der Entwicklung anwenden soll.

Sollten wir das commonBundle als ganzes Projekt erstellen und das gesamte Repository auf unseren Git-Server übertragen, oder ist es besser, die Quellcodeverwaltung nur für das Stammverzeichnis des commonBundles zu starten und nur dessen Inhalt zu pushen? Ich sehe diesen Ansatz in Bundles, die auf verfügbar sind github, aber ich kenne keine einfache und bequeme Möglichkeit, Bundles auf diese Weise zu entwickeln.

ex3v
quelle

Antworten:

176

Erstellen Sie ein neues leeres Symfony-Projekt

php composer.phar create-project symfony/framework-standard-edition demo/ 2.4.1
cd demo

Generieren Sie ein neues Bundle

(zum Beispiel src/Company/DemoBundle)

php app/console generate:bundle
cd src/Company/DemoBundle/

Initialisieren Sie Ihr Github-Repository in 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

Fügen Sie eine composer.json-Datei hinzu

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"
        }
    }
}

Jetzt haben Sie die Grundstruktur Ihres Bundles

Verwenden Sie es in einem anderen Projekt

composer.json:

    [...]
    "require" : {
        [...]
        "company/demobundle" : "dev-master"
    },
    "repositories" : [{
        "type" : "vcs",
        "url" : "https://github.com/Company/DemoBundle.git"
    }],
    [...]

Machen:

curl -sS https://getcomposer.org/installer | php
php composer.phar update company/demobundle

App / AppKernel:

new Company\DemoBundle\CompanyDemoBundle(),

Arbeite daran

  • Sie können Ihr DemoBundle in den src/CompanyOrdner klonen und dann manuell installieren
  • Sie können symlink verwenden

Fazit

Sie können Ihr Bundle in Ihrem ersten Projekt entwickeln und testen und es mit Github und Composer in Ihrem zweiten Projekt verwenden.

VBee
quelle
Das ist eine gute Schritt-für-Schritt-Anleitung, ich würde jedoch empfehlen, in eigenen Repositorys zu hosten
Boris Guéry
Sicher, aber vielleicht hat er ein privates Repository in Github.
VBee
Tolle Antwort @VBee! Ich habe vor einigen Tagen einige Nachforschungen zum gleichen Thema angestellt, war aber mehr daran interessiert, private Git-Repos oder lokale Repos (bevorzugt) zu verwenden.
Jovan Perovic
@VBee Tolles Tutorial, danke! Privates Repo ist kein Problem - wir haben unseren eigenen Git-Server. Das Problem ist, dass ich mit Ihrer Lösung nicht wirklich verstehe, wie man ein gemeinsames Modul im Team entwickelt. Muss jeder Entwickler ein neues sf2Projekt und clonedieses Repo erstellen src/? Was ist mit dem composer.lockHauptprojekt und dessen Verwendung, um die gleiche Version jeder Bibliothek im gesamten Team sicherzustellen? Wenn Sie einen guten und effektiven Weg kennen, fügen Sie ihn bitte Ihrer Antwort hinzu. Vielen Dank! :)
ex3v
3
Nur ein Tippfehler composer.phat sollte composer.phar sein
Stéphan Champagne
16

Ein wichtiger Punkt, den Sie wissen sollten, ist, dass Sie sich vom / vendor in Ihr Repo eintragen können. In der Tat erstellt Composer für jedes Bundle (oder Paket) eine zweite Fernbedienung namens "Composer", die auf das Repo des Pakets verweist, damit Sie in einem Arbeitskontext daran arbeiten können. Daher empfiehlt es sich, Ihr Paket für alle Ihre Projekte in Ihrer composer.json zu registrieren und /vendor/MyCompany/MyBundlevon jedem Projekt aus zu verpflichten.

Führen Sie als Beweis einfach ein git remote -vbeliebiges Bundle in Ihrem Anbieter aus.

Die schlechte Praxis wäre, Ihr Bundle als separates Projekt zu betrachten und Symlinks damit zu haben. Der Hauptgrund, warum dies die schlechte Praxis ist, ist, dass Sie keine Abhängigkeiten mit Ihrem Bundle deklarieren können. Darüber hinaus haben Sie einige Schwierigkeiten bei der Bereitstellung Ihrer Projekte.

flouflou2000
quelle
Ich erstelle ein eigenes Vendor Bundle. Ich möchte dieses Bundle zum Beispiel auf GitHub stellen und in anderen Projekten verwenden. Ich sollte beim Start ein neues Bundle im /srcoder im /vendorVerzeichnis generieren . Wenn ich dieses Bundle in ein anderes Projekt /vendoreinbinde, wird es dort sein, aber wo sollte ich sie zu Beginn generieren?
Exit196
5
Erstellen Sie in GitHub ein neues leeres Projekt, in dem Ihr Bundle gespeichert wird. Legen Sie eine composer.json fest. Sie können sogar eine sehr einfache composer.json festlegen, die nur den Namen und die Beschreibung Ihres Bundles enthält. Fügen Sie in Ihrem Projekt eine Anforderung zu Ihrem neuen Bundle hinzu und führen Sie eine aus composer update. Jetzt sollten Sie Ihr leeres Bundle im Vendor-Ordner sehen und können darin arbeiten. Wenn Sie möchten, dass Ihr Bundle öffentlich ist, fügen Sie es Packagist hinzu.
flouflou2000
4

In Symfony4 ist der generate:bundleBefehl nicht mehr verfügbar. Stattdessen können Sie diesem Tutorial folgen .

Erstellen Sie zunächst ein Projekt mit:

composer create-project symfony/website-skeleton my-project

Erstellen Sie dann ein my-project/lib/AcmeFooBundle/srcVerzeichnis. Hier wird dein Bundle leben. Der Namespace für dieses Verzeichnis lautet. Acme\AcmeFooBundleWenn Sie also eine Serviceklasse unter erstellen lib/AcmeFooBundle/src/Service/Foo.php, lautet der Namespace Acme\AcmeFooBundle\Service.

Jetzt müssen wir den Composer Autoloader anweisen, in diesem neuen Verzeichnis nach neuen Klassen zu suchen. Daher müssen wir den folgenden composer.json autoloadAbschnitt bearbeiten :

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

und laufen composer dump-autoload.

Jetzt müssen Sie nur noch Ihre Bundle-Klasse hinzufügen zu config/bundles.php:

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

und Abhängigkeitsinjektion zum Laden der Konfiguration aus Ihrem Bundle.

Wenn Sie Ihre Dienste überprüfen möchten, bevor Sie die Abhängigkeitsinjektion hinzufügen, können Sie sie einfach automatisch verdrahten unter config/services.yml:

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

Das ist alles. Befolgen Sie die Best Practices und codieren Sie weiter.

PS: Ich habe einen Beitrag mit einigen Tipps zur Entwicklung wiederverwendbarer Symfony-Bundles veröffentlicht .

Manolo
quelle
Übrigens habe ich auch ein Projekt zur Entwicklung wiederverwendbarer Bundles erstellt: github.com/msalsas/symfony-bundle-skeleton
Manolo