Je cherche à développer un paquet en PHP, mais je ne veux pas qu'il soit immédiatement disponible sur GitHub ou quelque part. Il est assez facile d'inclure un fichier Packagist dans mon composer.json
, mais comment puis-je ajouter un paquet local dans mon composer.json
? De plus, devrais-je construire le paquet dans /vendor/foo/bar
(par rapport à la racine composer.json
), ou devrais-je le placer ailleurs?
Edit : Je suppose que ma question concerne la façon dont tous les autres écrivent leurs paquets. Chaque nouveau package est-il ajouté à Packagist, puis lorsque vous souhaitez tester vos modifications, vous vous engagez dans GitHub (ou ailleurs), puis vous le rétablissez via Composer? Cela semble vraiment inefficace.
Étant donné que cette question comporte de nombreux composants/normes à expliquer, je vais essayer d’expliquer le plus possible et vous pouvez PM me chercher ou simplement sur Google pour des questions plus spécifiques au fur et à mesure de leur apparition.
Pour répondre à votre première question, "Comment puis-je ajouter un package local dans mon composer.json
?":
Si vous entendez "ajouter un paquet local" par chargement automatique de votre classe/paquet, vous pouvez le faire en utilisant les options PSR-4 ou PSR-0 ou Classmap dans composer.
Vous pouvez le rechercher sur Google si vous avez besoin de plus d'informations sur PSR-0, PSR-4 et Classmap.
"autoload": {
"psr-4": { "Core\\": "src/Core" } ## "standard": { "namespace" : "path/to/dir"}
}
Si vous voulez réellement ajouter un paquet local:
Créez un composer.json
pour le paquet local, par exemple:
{
"name": "localPackage/core",
"version": "dev-master"
}
Vous pouvez également spécifier d'autres propriétés et/ou dépendances selon vos besoins.
Compressez le package avec le fichier composer.json
en tant que fichier racine dans le archive.Zip
et placez-le à l'endroit souhaité.
Dans l'autre projet/package dans lequel vous souhaitez inclure le package local, ajoutez le nom du package local au paramètre requis, comme
"localPackage/core": "dev-master"
Ajoutez les éléments suivants sous le paramètre repositories
:
"repositories" : [
{
"type": "artifact",
"url": "path/to/localPackage.Zip"
}
]
Maintenant, si vous avez le paquet local sur git, alors il ne sera plus nécessaire de l’archiver (en omettant essentiellement l’étape 2) et il vous suffira de remplacer l’URL de l’exemple ci-dessus par le path/to/localPackage/.git
.
(Fin de montage)
Maintenant, pour répondre à la question plus large: "Comment développer et inclure un package Composer?":
Décidez la structure du répertoire. Communément c'est comme suit:
/PackageRoot
/src/PackageCore
composer.json ## this is your library’s composer.json
LICENSE
et configurez votre composer.json
.
Vous trouverez un exemple de l'un des fichiers composer.json
à l'adresse http://Pastebin.com/tyHT01Xg .
Téléchargez-le sur Github et identifiez la version . Utilisez Versioning Semantic (assurez-vous d’exclure/d’ignorer le répertoire vendor
lors du téléchargement sur Github).
Enregistrez le paquet avec Packagist (après vous être connecté).
Si vous avez étiqueté votre commit avec v1.0.0
(ou similaire), cela apparaîtra dans votre tableau de bord Packagist pour ce paquet.
Maintenant, si tout est bien fait, vous devriez pouvoir utiliser votre bibliothèque comme dépendance dans d’autres projets en l’ajoutant au composer.json
de ce projet.
Il semble que la plupart des réponses sur ce fil ne sont pas "au courant". Je suis nouveau sur Composer moi-même, mais ces réponses sont trompeuses. La question pourrait simplement se poser comme suit: "Comment puis-je développer un package de composition".
Oui, vous pouvez utiliser un référentiel personnalisé ou télécharger un package non terminé et le mettre à jour après chaque modification. Ce n'est ni la solution correcte ni la réponse à la question.
Cela n'aide pas que La documentation officielle du compositeur ne l'indique pas d'emblée, mais vous pouvez voir l'en-tête sur la page de documentation de Libraries :
Chaque projet est un package
C'est très important de comprendre
La page mentionnée précédemment poursuit:
Afin de rendre ce paquet installable, vous devez lui donner un nom. Vous faites cela en ajoutant la propriété name dans
composer.json
{ "name": "acme/hello-world", "require": { "monolog/monolog": "1.0.*" } }
Dans cet exemple jusqu'à présent, nous avons un paquet requis et maintenant un nom. Notez le format vendor/name
.
Passons maintenant au chargement automatique de nos propres fichiers, documentés sur la page Utilisation de base .
{ "autoload": { "psr-4": {"Acme\\": "src/"} } }
Cela chargera automatiquement les fichiers de classe namespaced dans le répertoire src/Acme
.
Pour le plaisir.
Installez ou mettez à jour le paquet avec la commande:
composer update
ou
php composer.phar update
Cela téléchargera les packages requis et créera le fichier autoload.php.
La structure de notre projet devrait ressembler à ce qui suit:
src
Acme
Foo.php
vendor
monolog
...
composer.json
Maintenant pour tester.
Inclure autoload.php
require_once 'path/to/project/vendor/autoload.php';
En supposant que Foo.php ressemble à ceci:
<?php
namespace Acme;
class Foo {
public static function bar(){
return 'baz';
}
}
?>
nous pouvons alors appeler cela de notre script:
echo Acme\Foo::bar(); // baz
S'il vous plaît corriger toute information trompeuse que j'ai pu avoir déclaré. C'est ce qui semble être la solution à une question populaire.
Voici un récapitulatif des solutions et des miennes
Puisque vous ne voulez pas encore publier, vous êtes en développement, c'est une mauvaise option.
Vous pouvez ne pas vouloir publier votre source de bibliothèque sur github, ne pas vouloir payer pour un repo privé ou pouvoir utiliser un service cloud externe (en raison de politiques politiques ou de réseau).
Vous pouvez utiliser le chemin du référentiel composer dans votre exemple d'implémentation pour pointer sur un fichier Zip local en tant que version. Vous devrez re-Zip chaque fois que vous apportez une modification à la bibliothèque, même avec un fichier de commandes pour le faire, c'est dégoûtant.
Nous nous en approchons, mais vous devrez faire une mise à jour du compositeur chaque fois que vous changez de bibliothèque et que vous voulez tester votre exemple d'implémentation. Cela imite les productions mais est lourd. Personnellement, je recommande cette solution, même si ce n'est pas sans cervelle.
C'est un hack, mais vous pouvez simplement ajouter:
{
"require": {
},
"autoload": {
"psr-4": {
"yourlibnamespace": "D:\\Code\\yourlib\\src\\"
}
}
}
Veuillez noter que vous devrez copier + coller la section 'require' de votre lib dans votre exemple d'implémentation. Changez 'yourlibnamespace' en votre espace de noms de bibliothèque et "D:\Code\yourlib\src \" en votre chemin local vers votre source de bibliothèque.
De cette façon, tous les changements sont immédiatement reflétés. Cependant, vous n'utiliserez ni ne testerez pas le fichier composer.json de votre bibliothèque. Si vous modifiez une exigence de votre bibliothèque .json, elle ne sera pas transmise du tout. Cela présente donc de gros inconvénients, mais fait ce que vous voulez, à savoir tester immédiatement l’implémentation de votre bibliothèque avec le moins de commandes possible.
En général, vous n'avez que src\et tests \, mais beaucoup ont des exemples\où vous pouvez trouver des exemples d'implémentations. Au fur et à mesure que vous développez votre application, vous pouvez contribuer à ces exemples d'implémentation. Vous pouvez le faire dans un repo local git/svn, et vous avez l’avantage d’obtenir le "require" de la bibliothèque, plus l’espace de nom automatiquement. C'est le meilleur des mondes. Je recommande cette méthode.
Pour rendre le développement plus efficace, il suffit de faire un lien symbolique du référentiel de développement vers un répertoire qui l'a déjà installé.
Par exemple, si /Code/project-1
nécessite un package dans /Code/package-1
, je:
package-1
dans GitHub (peut même être privé). project-1
de l'installer à l'aide d'un référentiel personnalisé (voir les autres réponses pour obtenir le lien vers la configuration du référentiel). /Code/project-1/vendor/developer/package-1
à /Code/package-1
. Ainsi, lorsque je modifie /Code/package-1
, cela se reflète immédiatement dans /Code/project-1
.
Peut-être que l'ajout d'un référentiel personnalisé vous aidera?
https://github.com/composer/composer/blob/master/doc/05-repositories.md
Vous pouvez très facilement configurer un référentiel git local avec votre bibliothèque.
Bien sûr, si vous utilisez composer pour gérer les dépendances, vous devez créer votre bibliothèque ailleurs et la télécharger au format vendeur/via composeur car c'est tout ce que je suppose.
C’est mon flux de création et de développement local d’un nouveau package Composer:
Ce n’est pas encore idéal, mais le travail est fait pour les paquets de taille petite à moyenne.
Mon flux de travail ne répond pas complètement à la question du PO mais peut être utile pour les autres.
Donc, ce que je fais est simple: j'ajoute le paquet directement dans le répertoire du fournisseur, directement ou à l'aide d'un lien symbolique.